2014-06-05 5 views
11

J'ai lu this post mais je ne suis pas. J'ai vu this mais n'ai pas vu un exemple approprié de convertir un ByteArrayInputStream en String en utilisant un ByteArrayOutputStream.Convertir le contenu d'un ByteArrayInputStream en chaîne

Pour récupérer le contenu d'un ByteArrayInputStream en tant que String, utilise un ByteArrayOutputstream recommandé ou y at-il un moyen plus préférable?

Je considérais this example et étendre ByteArrayInputStream et utiliser un Decorator pour augmenter la fonctionnalité au moment de l'exécution. Tout intérêt à ce que ce soit une meilleure solution à l'emploi d'un ByteArrayOutputStream?

+1

Vous voulez probablement un 'InputStreamReader', comme décrit dans le deuxième lien que vous avez donné. Un 'ByteArrayOutputStream' ne convertira pas les octets en caractères. –

+0

Avez-vous vraiment un ByteArrayInputStream (ce qui implique que vous avez un octet []) ou avez-vous juste un InputStream? –

+0

@BrettOkken J'ai vraiment un ByteArrayInputStream dont le constructeur est passé un tableau d'octets (taille variable) – Mushy

Répondre

23

Un ByteArrayOutputStream peut lire de tout InputStream et au rendement final un byte[].

Cependant, avec un ByteArrayInputStream il est plus simple:

int n = in.available(); 
byte[] bytes = new byte[n]; 
in.read(bytes, 0, n); 
String s = new String(bytes, StandardCharsets.UTF_8); // Or any encoding. 

Pour une ByteArrayInputStreamavailable() donne le nombre total d'octets.


Réponse à un commentaire: en utilisant ByteArrayOutputStream

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
byte[] buf = new byte[8192]; 
for (;;) { 
    int nread = in.read(buf, 0, buf.length); 
    if (nread <= 0) { 
     break; 
    } 
    baos.write(buf, 0, nread); 
} 
in.close(); 
baos.close(); 
byte[] bytes = baos.toByteArray(); 

Ici peut-être une InputStream.

+1

Comment un ByteArrayOutputStream peut-il lire un ByteArrayInputStream? – Mushy

+1

J'ai étendu la réponse. En principe, on boucle la lecture depuis 'InputStream' et en écrivant' ByteArrayOutputStream'. En dehors de la tradition, le tampon d'E/S a une taille rituelle qui est une puissance de 2. –

+0

D'accord avec une puissance de 2 tailles; J'aime ça et merci. – Mushy

1

Utilisez Scanner et passer à son constructeur les ByteArrayInputStream puis lire les données à partir de votre scanner, vérifier cet exemple:

ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(new byte[] { 65, 80 }); 
Scanner scanner = new Scanner(arrayInputStream); 
scanner.useDelimiter("\\Z");//To read all scanner content in one String 
String data = ""; 
if (scanner.hasNext()) 
    data = scanner.next(); 
System.out.println(data); 
+0

Si j'ai le document 'XML' ou' HTML', serai-je capable de le lire sans limites? – Mushy

+0

Oui, il n'y a aucune limitation. – Mifmif

1

Utilisez Base64

En supposant que vous avez obtenu votre ByteArrayOutputStream:

ByteArrayOutputStream baos =... 
String s = new String(Base64.Encoder.encode(baos.toByteArray())); 

Voir http://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html

+0

Belle solution. Mais, je devrais d'abord connecter mon ByteArrayInputStream dans mon ByteArrayOutputStream. Comment cela est-il accompli? – Mushy

+1

Il est important de dire que le Base64.Encoder a été publié dans le Java 8. :) – Jacobi

+0

Il devrait être String s = new String (Base64.getEncoder(). Encoder (baos.toByteArray())); Merci quand même. –

6

Pourquoi personne n'a mentionné org.apache.commons.io.IOUtils?

import java.nio.charset.StandardCharsets; 
import org.apache.commons.io.IOUtils; 

String result = IOUtils.toString(in, StandardCharsets.UTF_8); 

Juste une ligne de code.

+0

J'ai ajouté les deux instructions 'import' requises afin que tout le monde ne doive pas les rechercher. Désolé ... ce n'est plus une seule ligne de code;) – dokaspar

Questions connexes