2009-05-06 65 views
0

我有一个输入ByteArrayOutputStream,需要将其转换为CharBuffer。ByteArrayOutputStream到CharBuffer

我试图避免创建一个新的字符串。无论如何要这样做。

我试图做到以下,但我没有字符串的编码,所以下面的代码将无法正常工作(输出无效)。

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

回答

2

您必须提供编码。班级如何知道如何转换。在写入ByteOutputStream或完全避免流之前,您不能确定编码吗?如果没有,你需要做的假设,并可能失败

提供的编码可以在字节的缓冲区转换成字符缓冲区

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

我可以设置编码,但我在哪里设置它来获得字符缓冲区。 – 2009-05-06 20:33:05

+0

我编辑了答案来显示转换 – 2009-05-06 21:31:58

0

ByteBuffer.asCharBuffer给你一个非常字面2 byte s到char(或大或小尾数)更新反映在两个缓冲区中。

大概你想通过一些合理的编码从byte s到char s。有很多方法可以做到这一点。例如[new String(byte [],String encoding)] [1]。他们大多会以某种形式通过CharsetEncoder。那么它应该是直接从那里得到CharBuffer

CharBuffer是一个相当低级别的事情。你确定这真的是你想要的吗?

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

0

ByteBuffer.asCharBuffer()假定字节是UTF-16。 (我在文档中找不到任何明确说明这一点的文档,但实现只是将字节对视为字符的低字节和高字节)。如果您需要另一种编码,则必须使用不同的方法。

最简单的方法是只创建一个String

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

我知道你说你是“试图避免创建一个新的字符串”,但您的代码段是无论如何分配一个单独的字节数组(ByteArrayOutputStream.toByteArray() “根据文档创建一个新分配的字节数组”)。因为CharBuffer支持随机访问,并且许多编码(特别是UTF-8)是可变宽度的,所以最好将整个事件转换为前面的字符。

如果你真的只想对字符进行流式访问(而不是随机访问),那么可能CharBuffer不是底层代码接受的最佳接口。