0

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

我试图避免创建一个新字符串。有没有办法做到这一点。

我正在尝试执行以下操作,但我没有字符串的编码,因此下面的代码将不起作用(无效输出)。

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

3 回答 3

2

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

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

Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(yourByteBuffer);
于 2009-05-06T20:16:41.283 回答
0

ByteBuffer.asCharBuffer给你一个非常字面byte的 s to char(大端或小端),更新反映在两个缓冲区中。

大概你想通过一些合理的编码从bytes 到s 。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)

于 2009-05-06T21:07:50.100 回答
0

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

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

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

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

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

于 2009-05-06T21:11:28.050 回答