2014-06-05 15 views
11

Ich lese this post, aber ich nicht folgen. Ich habe gesehen this, aber habe kein richtiges Beispiel für die Umwandlung eines ByteArrayInputStream zu String mit einem ByteArrayOutputStream gesehen.Konvertieren von Inhalt eines ByteArrayInputStream in String

Um den Inhalt eines ByteArrayInputStream als String abzurufen, wird ein ByteArrayOutputstream empfohlen oder gibt es einen besseren Weg?

Ich erwog this example und erweitern ByteArrayInputStream und verwenden eine Decorator, um die Funktionalität zur Laufzeit zu erhöhen. Gibt es ein Interesse daran, eine bessere Lösung für die Verwendung eines ByteArrayOutputStream?

+1

Sie möchten wahrscheinlich einen 'InputStreamReader', wie im zweiten Link beschrieben, den Sie angegeben haben. Ein 'ByteArrayOutputStream' konvertiert die Bytes nicht in Zeichen. –

+0

Haben Sie wirklich einen ByteArrayInputStream (was bedeutet, dass Sie ein Byte [] haben) oder haben Sie nur einen InputStream? –

+0

@BrettOkken Ich habe wirklich einen ByteArrayInputStream, dessen Konstruktor ein Array von Bytes (variierende Größe) übergeben wird – Mushy

Antwort

23

A ByteArrayOutputStream von jedem InputStream und am Ende Ausbeute ein byte[] lesen kann.

jedoch mit einem ByteArrayInputStream ist es einfacher:

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. 

Für eine ByteArrayInputStreamavailable() die Gesamtzahl der Bytes ergibt.


Antwort Kommentar: ByteArrayOutputStream mit

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

Hier kann in jedem Input sein.

+1

Wie würde ein ByteArrayOutputStream von einem ByteArrayInputStream lesen? – Mushy

+1

Ich habe die Antwort erweitert. Im Prinzip wird das Lesen aus dem 'InputStream' und das Schreiben in den 'ByteArrayOutputStream' gelesen. Aus der Tradition hat der I/O-Puffer eine rituelle Größe, die eine Macht von 2 ist. –

+0

Vereinbaren Sie mit Macht von 2 Größe; Ich mag das und danke dir. – Mushy

1

Verwenden Scanner und es Konstruktor übergeben Sie die ByteArrayInputStream dann die Daten aus Ihrem Scanner lesen, um dieses Beispiel überprüfen:

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

Wenn ich 'XML' oder' HTML' doc habe, kann ich es ohne Einschränkungen lesen? – Mushy

+0

Ja, es gibt keine Einschränkung. – Mifmif

1

Verwenden Base64-Codierung

Vorausgesetzt, dass Sie Ihre ByteArrayOutputStream bekam:

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

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

+0

Schöne Lösung. Aber, ich würde zuerst meinen ByteArrayInputStream in meinem ByteArrayOutputStream verbinden müssen. Wie wird das erreicht? – Mushy

+1

Es ist wichtig zu sagen, dass der Base64.Encoder in Java 8 veröffentlicht wurde. :) – Jacobi

+0

Es sollte String s = new sein String (Base64.getEncoder(). Encode (baos.toByteArray())); trotzdem danke. –

6

Warum niemand org.apache.commons.io.IOUtils erwähnt?

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

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

Nur eine Zeile Code.

+0

Ich habe die zwei erforderlichen 'import' Anweisungen hinzugefügt, so dass nicht jeder nach ihnen suchen muss. Entschuldigung ... es ist nicht mehr nur eine Zeile Code;) – dokaspar

Verwandte Themen