IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Lire ligne et byte[] sur un même InputStream


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Par défaut Lire ligne et byte[] sur un même InputStream
    Bonjour!

    Donc, j'ai un flux ouvert ou transite du texte et du binaire.
    Je doit d'abord lire du texte donc j'utilise un BufferedReader et la methode readLine.

    Mais arrive le moment ou je doit lire du binaire. Avec un buffer de byte (type Byte[]).
    Je doit donc utiliser InputStream.read(Byte[]).
    Le problème est que la méthode InputStream.available() me renvoie 0 alors qu'il reste des données à lire.
    Donc je sais pas quand m'arrêter...

    J'ai fait des testes et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // in est mon InputStream optenu d'un socket
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    // ici in.available() me renvoie bien le nombre de byte restant.
    br.readLine();
    // ici elle me renvoie 0 :/
    Je n'ai pas trouver de class qui lit des ligne de texte et des Byte[] sur un InputStream.

    Je suppose qu'il y a une solution !
    ça serait bête sinon .

    Donc quelqu'un sait t-il comment faire ?

    Merci!

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Je te suggère de lire toute ta ligne sous la forme d'un byte[].

    Ensuite, tu sépares ton tableau en deux parties :
    - le texte, que tu récupères grâce aux méthodes de la classe String
    - le byte[] qui t'intéresse
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Par défaut
    Le truc c'est que j'ai plusieurs ligne a lire !

    Et la détection des fins de ligne d'une dans un Byte[] ça va être compliquer !
    Il y a bien une solution efficace, java c'est du plutôt du haut niveau.

    Lire byte à byte ça sera surement beaucoup plus lent que d'utiliser un BufferedReader aussi...

  4. #4
    Membre confirmé Avatar de daronmaster
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 67
    Par défaut
    Bonjour,

    à partir de quel moment sais-tu que tu dois lire du binaire ?

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    InputStream.read(Byte[])
    Sauf que le flux a été bufferisé par le BufferedReader et une partie a donc déjà été lu

    Pourquoi ne pas faire ça ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    InputStream iStream = new FileInputStream("test.txt");
    		BufferedReader br = new BufferedReader(new InputStreamReader(iStream));
    		String line = null;
    		while(!(line = br.readLine()).equals("ligne2")) {
    			System.out.println("lecture ligne : " + line);			
    		}
    		System.out.println("ligne : " + line);
    		char[] b = new char[5000];
    		System.out.println("nombre char de lu : " + br.read(b));
    		System.out.println("bytes : " + new String(b));
    Il n'est pas possible d'utiliser des char (autant demander...) ?

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Je crois que t'as déjà à la base un problème de spécification de ton format de fichier. Si ton fichier contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    une ligne de texte 0x0D 0x0A 0x0F
    Que dois-ton lire?
    "une ligne de texte" + 2 bytes: 0x0A, 0X0F
    "une ligne de texte" + 1 byte: 0x0F


    Le mieux c'est d'avoir plutot un format binaire dans lequel par moment tu spécifie des chaines de caractères sous la forme <taille de la chaine><caractères de la chaine><suite du format>

  7. #7
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Je crois que t'as déjà à la base un problème de spécification de ton format de fichier.
    Juste pour indication, il y a un exemple simple de spécification du genre.
    Des requêtes HTTP, une réponse peut contenir du texte puis un gros champs de byte pour le fichier. Mais en général, la taille à lire est indiquée avant

  8. #8
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Par défaut
    Des requêtes HTTP
    C'est ça que je doit traiter !
    Requette post avec un fichier envoyer par le client.

    Il n'est pas possible d'utiliser des char (autant demander...) ?
    Nan je doit le traiter comme du binaire.
    J'ai essayer de lire des chaine avec un bufferedreader sur du binaire mais dans le fichier, j'ai des caractère après, et pas de caractère inconnu donc il doit y avoir une conversion.
    En plus c'est pas top quoi ^^!

    Des requêtes HTTP, une réponse peut contenir du texte puis un gros champs de byte pour le fichier. Mais en général, la taille à lire est indiquée avant
    Oui c'est vraie mais il serait plus pratique de pouvoir utilisé la méthode InputStream.available pour ma boucle de recopie.
    De plus, il faut déduire chaque ligne lu après le content-type en comptant que le \r\n a une n'est pas garder dans la chaine renvoyer par le BufferedReader. Donc moin optimiser je pense.

    Sauf que le flux a été bufferisé par le BufferedReader et une partie a donc déjà été lu
    Ok je comprend.

    Donc ya pas de solution ?

    Sans compter utiliser le content-length ("taille à lire [...] indiquée avant")

  9. #9
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,

    Pour info:

    Citation Envoyé par millie Voir le message
    Juste pour indication, il y a un exemple simple de spécification du genre.
    Des requêtes HTTP, une réponse peut contenir du texte puis un gros champs de byte pour le fichier. Mais en général, la taille à lire est indiquée avant
    C'est exact mais entre l'entête et le corps de la requête HTTP, il y a une ligne toujours une ligne vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    HTTP..<CRLF>
    Entête<CRLF>
    <CRLF>
    Corps

Discussions similaires

  1. Sur la même ligne mettre du texte à gauche et à droite
    Par Oberown dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 20/06/2007, 15h50
  2. Réponses: 6
    Dernier message: 28/09/2005, 10h24
  3. Aligner du texte à gauche et à droite sur une même ligne ?
    Par pontus21 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 12/04/2005, 11h25
  4. 2 éléments sur une même ligne
    Par ben_iap dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/11/2004, 17h27
  5. 2 recordset sur la même ligne
    Par gunnm dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 14/08/2004, 20h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo