ByteArrayOutputStream到CharBuffer

时间:2009-05-06 20:12:32

标签: java encoding bytearrayoutputstream

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

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

我试图执行以下操作,但我没有字符串的编码,因此下面的代码无效(输出无​​效)。

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

3 个答案:

答案 0 :(得分:2)

您必须提供编码。班级应该如何知道如何转换。在写入ByteOutputStream或完全避免流之前,无法确定编码。如果不是,你必须做假设并且可能会失败

提供编码,您可以将字节缓冲区转换为字符缓冲区

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

答案 1 :(得分:0)

ByteBuffer.asCharBufferbyte(大或小端)提供了两个char字面值,两个缓冲区都反映了更新。

据推测,您希望通过一些合理的编码从byte转到char。有很多方法可以做到这一点。例如[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)

答案 2 :(得分:0)

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

最简单的方法是创建String

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

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

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