2009-05-06 3 views
0

Ich habe eine Eingabe ByteArrayOutputStream und muss dies in einen CharBuffer konvertieren.ByteArrayOutputStream zu CharBuffer

Ich versuchte zu vermeiden, eine neue Zeichenfolge zu erstellen. Gibt es das sowieso?

Ich habe versucht, das Folgende zu tun, aber ich habe nicht die Codierung für die Zeichenfolge, so dass der folgende Code nicht funktioniert (ungültige Ausgabe).

ByteBuffer byteBuffer = ByteBuffer.wrap(byteOutputStream.toByteArray()); 
CharBuffer document = byteBuffer.asCharBuffer(); 

Antwort

2

Sie müssen eine Codierung bereitstellen. Wie sollte die Klasse wissen, wie man konvertiert? Können Sie die Codierung nicht feststellen, bevor Sie in einen ByteOutputStream schreiben oder den Stream vollständig vermeiden? Wenn Sie nicht Annahmen zu tun haben, und könnte

eine Codierung nicht Bereitstellung können Sie die Byte-Puffer auf einen char buffer konvertieren

Charset charset = Charset.forName("ISO-8859-1"); 
CharsetDecoder decoder = charset.newDecoder(); 
CharBuffer charBuffer = decoder.decode(yourByteBuffer); 
+0

Ich könnte die Codierung einstellen, aber wo ich es einstellen, um einen Zeichenpuffer zu bekommen. –

+0

Ich bearbeitete die Antwort, um die Konvertierung anzuzeigen –

0

ByteBuffer.asCharBuffer Sie gibt eine sehr wörtliche zwei byte s char (groß oder Little-Endian) mit Aktualisierungen in beiden Puffern.

Vermutlich möchten Sie von byte s zu char s durch eine angemessene Kodierung gehen. Es gibt viele Möglichkeiten, dies zu tun. Zum Beispiel [new String (Byte [], String encoding)] [1]. Meistens werden sie in irgendeiner Form durch CharsetEncoder gehen. Dann sollte es gerade sein, von dort einen CharBuffer zu bekommen.

CharBuffer ist eine ziemlich niedrige Art der Sache. Bist du sicher, dass du das wirklich willst?

[1]: http://file:///C:/Users/tackline/sun/docs/api/java/lang/String.html#String(byte[], java.lang.String)

0

ByteBuffer.asCharBuffer() nimmt an, dass die Bytes UTF-16. (Ich kann nichts in den Dokumenten finden, das dies explizit sagt, aber die Implementierung behandelt nur Bytepaare als die Low- und High-Bytes von Zeichen.) Wenn Sie eine andere Codierung benötigen, müssen Sie einen anderen Ansatz verwenden.

Der einfachste Ansatz ist, einfach zu erstellen String:

CharBuffer document = CharBuffer.wrap(byteOutputStream.toString(encoding)); 

Ich weiß, Sie sagten, Sie wurden als „eine neue Zeichenfolge zu schaffen versuchen zu vermeiden“, aber Ihr Code-Snippet wurde trotzdem ein separates Byte-Array Zuweisung (ByteArrayOutputStream.toByteArray() "Erstellt ein neu zugewiesenes Byte-Array" gemäß den Dokumenten. Da CharBuffer Random Access unterstützt und viele Codierungen (insbesondere UTF-8) variable Breite haben, ist es wahrscheinlich am besten, das ganze Ding sowieso in Zeichen umzuwandeln.

Wenn Sie wirklich wollen nur Streaming-Zugriff (im Gegensatz zu Random Access) auf die Zeichen dann vielleicht CharBuffer ist nicht die beste Schnittstelle für den zugrunde liegenden Code zu akzeptieren.

+0

Ich ging voran und nutzte nur die Zeichenfolge und verwarf den Charbuffer. Aber ich mochte, was Sie dort getan haben. Ich habe den toString bei Byteoutputstream vergessen. –