web-dev-qa-db-fra.com

Convertir le contenu d'un ByteArrayInputStream en chaîne

J'ai lu ce post mais je ne suis pas. J'ai vu this mais je n'ai pas vu un bon exemple de conversion d'un ByteArrayInputStream en String en utilisant un ByteArrayOutputStream.

Pour récupérer le contenu d'un ByteArrayInputStream en tant que String, est-il recommandé d'utiliser un ByteArrayOutputstream ou existe-t-il un moyen plus préférable?

Je considérais cet exemple et étendre ByteArrayInputStream et utiliser un Decorator pour augmenter les fonctionnalités au moment de l'exécution. Tout intérêt à ce que ce soit une meilleure solution pour utiliser un ByteArrayOutputStream?

21
Mushy

Un ByteArrayOutputStream peut lire à partir de n'importe quel InputStream et à la fin produire un byte[].

Cependant avec un ByteArrayInputStream c'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 au commentaire: utilisation de 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 n'importe quel InputStream.

31
Joop Eggen

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);

Une seule ligne de code.

13
Cherry

Utilisez Scanner et passez à son constructeur le ByteArrayInputStream puis lisez les données de votre scanner, vérifiez 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);
1
Mifmif

Utiliser l'encodage 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

1
Bowser Jr.