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

Langage Java Discussion :

[debutant] conversion byte[] -> String , avec StringBuilder


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut [debutant] conversion byte[] -> String , avec StringBuilder
    Bonjour,

    Je m'y perds un peu avec les Stream, les Reader, les Buffered ...etc ;-) mais ça commence à venir.

    Comme je l'ai appris grâce à ce forum, il est nettement mieux de passer par StringBuilder que de concaténer des String...

    Alors voilà :

    je recois des paquets de byte[] de taille 1000, et l'ensemble de ces paquets represente une String.

    Donc on peut faire çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String tmp;
    String s="";
     
    while (il existe un paquet : byte[] paquet ) {
    tmp=new String(paq);
    s=s+tmp;
    }

    Mais je n'arrive pas à réécrire ça avec des StringBuilder....si quelqu'un peut m'indiquer la soluce :-)

    Merci, a+

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Pour construire un "StringBuilder" à partir d'un tableau de "byte":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringBuilder sb=new StringBuilder(new String(paquet));
    Pour concaténer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sb.append(new String(paquetSuivant));

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Et voilà pour info le code correspondant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     
    InputStream is=get.getResponseBodyAsStream();
    BufferedInputStream bis=new BufferedInputStream(is);
    ZipInputStream zis = new ZipInputStream(bis);
     
    //Décompression du zip vers tmp.txt
    zis.getNextEntry();
    int BUFFER=1000;
    int count;
    byte data[] = new byte[BUFFER];
     
    String rep=System.getProperty("user.dir");
    String sep=System.getProperty("file.separator");
    FileOutputStream fos = new FileOutputStream(rep+sep+"tmp.txt");
    BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER);
     
    while ((count = zis.read(data, 0, BUFFER)) != -1) {
    	bos.write(data, 0, count);
    }
    bos.close();
    zis.close();
    fos.close();
    get.releaseConnection();
     
     
    // Import du .txt en String
    BufferedReader in = new BufferedReader(new FileReader(rep+sep+"tmp.txt"));
    StringBuilder buffer=new StringBuilder();
    String s = new String();
    while((s = in.readLine())!= null)
    	buffer.append(s).append(nl);
    in.close();
     
     
    //Effacement du fichier tmp.txt
    File  tmptxt;
    tmptxt=new File(rep+sep+"tmp.txt");
    tmptxt.delete();
     
     
    String resultatVoulu=buffer.toString();

    Le but de ma question étant de supprimer le passage par un fichier temporaire (tmp.txt).

    Si les pros ont des commentaires à faire sur le code, qu'ils n'hésitent pas : c'est encore un peu confus.

    Merci

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    merci de ta réponse seriousme :-)

    Mais est-ce que le fait d'instancier une String pour chaque paquet ne revient pas à concatener des String comme je le fais ?

  5. #5
    Membre confirmé
    Avatar de DBProg
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 579
    Points
    579
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    byte data[] = new byte[BUFFER];
    StringBuffer buffer = new StringBuffer();
     
    while ((count = zis.read(data, 0, BUFFER)) != -1) {
        buffer.append(new String(data));
    }
     
    return buffer.toString();
    Niveau mémoire c'est surement pas la meilleure chose à faire, mais je pense que cette solution fonctionne. Après si quelqu'un a mieux, n'hésitez pas !

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Mais est-ce que le fait d'instancier une String pour chaque paquet ne revient pas à concatener des String comme je le fais ?
    Oui mais au début tu parlais de séquences de "byte", or la méthode "append" de la classe "StringBuilder" n'est pas surchargée pour les séquences de "byte" d'où le passage par le constructeur de la classe "String" qui les accepte et renvoie une "String"; mais comme la méthode "readLine" renvoie une "String" directement pas besoin de le faire.

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringBuffer buffer = new StringBuffer();
    Si on n'utilise pas le "threadsafety" de la classe "StringBuffer" mieux vaut utiliser des "StringBuilder" plus performants.

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Ok merci pour vos réponses,

    dbprog, j'ai effectivement essayé cette solution après les indications de seriousme ; (en utilisant StringBuilder).

    Alors ça marche, mais à moitié ;-). J'intuite peut être un problème de charSet...
    Ce qui est curieux, c'est que mon code (celui qui passe par un tmp.txt) marche très bien et il n'y a aucune référence aux charSet....

    J'investigue. (je plane)

  9. #9
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Si c'est un problème de charset il y a la classe "CharsetDecoder".

  10. #10
    Membre confirmé
    Avatar de DBProg
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 579
    Points
    579
    Par défaut
    Citation Envoyé par seriousme
    Si on n'utilise pas le "threadsafety" de la classe "StringBuffer" mieux vaut utiliser des "StringBuilder" plus performants.
    Tu peux m'expliquer un petit peu stp ? Qu'est-ce que tu entends par threadsafety ?

    Citation Envoyé par absolut75
    Alors ça marche, mais à moitié ;-). J'intuite peut être un problème de charSet...
    Montre nous ton problème (code + sortie) que l'on comprenne ce qu'il ne va pas

  11. #11
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Tu peux m'expliquer un petit peu stp ? Qu'est-ce que tu entends par threadsafety ?
    En contexte multi-thread les "StringBuilder" ne sont pas sûr car des threads peuvent accéder aux données de manière désordonnée ce qui conduit à un comportement indéterminé.
    En revanche les "StringBuffer" sont synchronisés empêchant que plusieurs threads n'accèdent en même temps à la même donnée.

  12. #12
    Membre chevronné
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Points : 2 208
    Points
    2 208
    Par défaut
    Tu peux m'expliquer un petit peu stp ? Qu'est-ce que tu entends par threadsafety ?
    un StringBuffer peut étre manipuler par plusieurs threads sans que cela entraine une corruption des données (pas de synconisation à faire ), et cela implique une perte de performance face à StringBuilder qui elle n'est pas thread-safe .

    Voilà, j'éspère que c'est suffisamment clair, sinon n'hésite pas à poser des questions

    [EDIT] grillé

  13. #13
    Membre confirmé
    Avatar de DBProg
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 579
    Points
    579
    Par défaut
    Merci pour l'info, je n'avais jamais fais attention à cette suptilité

  14. #14
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Montre nous ton problème (code + sortie) que l'on comprenne ce qu'il ne va pas
    Salut !

    Ben le code je l'ai mis un peu plus haut (version ok en passant par un fichier tmp.txt).
    Pour la version qui bugue, je remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while ((count = zis.read(data, 0, BUFFER)) != -1) {
    	bos.write(data, 0, count);
    }
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while ((count = zis.read(data, 0, BUFFER)) != -1) {
    	buffer.append(new String(data));
    }
    (et suppression de tout ce qui est relatif au .txt)

    Pour le resultat, j'ecris dans deux fichier les deux String obtenues. Et celui de la deuxième version est "légèrement corrompu" (malheureusement je ne peux pas vous les transmettre).

    Si j'ouvre ces deux fichiers en Hexadecimal, un premier indice est que dans la version ok, mes sauts de lignes sont codés par "0D 0A" tandis que dans l'autre c'est juste "0A" ... et une ou deux autres bizarreries ....


    Je suis perdu, help ;-)

  15. #15
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Points : 173
    Points
    173
    Par défaut
    Déjà, avec le StringBuffer, tu risques d'avoir des problèmes en fin de stream :
    lors du dernioer passage dans read, si count < BUFFER, tous les bytes compris entre les index count et BUFFER ne sont pas écrasés.
    Avec le bos, tu n'écriras que les n premiers bytes de ton array (entre 0 et count) fraichement lus, tandis qu'avec le StringBuffer tu écriras le tableau dans son intégralité (les n premiers + ceux entre count et BUFFER qui datent de la lecture précédente)

    j'espere avoir ete clair...



    [edit] j'ai lu le stream un peu en travers, mais pourquoi ne pas utiliser un StringWriter ?
    [re-edit] d'ailleurs pour manipuler du texte, il est recommandé d'utiliser les Writer plutot que les OutputStream

  16. #16
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Je crois que tu as mis le doigt sur un des soucis....en effet, j'ai des series de bytes qui se retrouvent "dans le désordre". J'ai pas tout saisi, mais je vais tacher d'apronfondir.

    En ce qui concerne l'utilisation de Stream, ben en fait j'utilise ce que j'ai pu trouver dans le package ZIP de la JDK...C'est de la bricole, car je comprends pas encore bien tout ce fourbi (stream, writer, reader, buffered et les autres).

    En gros le prog lance une requete https (httpClient jakarta) sur un site qui renvoie un .zip, que je veux decompresser "à la volée" et mettre le resultat dans une String. En passant par un .txt sur le dur ça marche...

  17. #17
    Membre chevronné
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Points : 2 208
    Points
    2 208
    Par défaut
    J'éspère que ce tutoriel sur java.io pourra t'aider

  18. #18
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Points : 173
    Points
    173
    Par défaut
    normalement, ceci devrait marcher...
    je ne vois pas ou est le probleme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ....
     
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    BufferedOutputStream bos = new BufferedOutputStream(baos, BUFFER);
    while ((count = zis.read(data, 0, BUFFER)) != -1) {
       bos.write(data, 0, count);
    }
    bos.flush();
    System.out.println(baos.toString());
     
    ....

  19. #19
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Un grand merci à vous !

    dude, effectivement ça marche :-) . Tu ne voyais pas le problème, je ne voyais pas la solution.

    merci aussi pour le tuto, bien utile.

    A+

  20. #20
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    en fait, je crois que c'est le flush() qui change tout ;-)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/12/2012, 11h19
  2. Conversion byte [] -> String
    Par MiJack dans le forum Langage
    Réponses: 3
    Dernier message: 20/10/2005, 18h16
  3. [debutant]Convertir un pointeur byte en String
    Par patmaba dans le forum SL & STL
    Réponses: 3
    Dernier message: 22/07/2005, 13h34
  4. [C#] Conversion d'un string en byte[] et inversement
    Par david71 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/12/2004, 15h10
  5. Réponses: 2
    Dernier message: 29/03/2004, 13h44

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