我有一个输入 ByteArrayOutputStream,需要将其转换为 CharBuffer。
我试图避免创建一个新字符串。有没有办法做到这一点。
我正在尝试执行以下操作,但我没有字符串的编码,因此下面的代码将不起作用(无效输出)。
ByteBuffer byteBuffer = ByteBuffer.wrap(byteOutputStream.toByteArray());
CharBuffer document = byteBuffer.asCharBuffer();
我有一个输入 ByteArrayOutputStream,需要将其转换为 CharBuffer。
我试图避免创建一个新字符串。有没有办法做到这一点。
我正在尝试执行以下操作,但我没有字符串的编码,因此下面的代码将不起作用(无效输出)。
ByteBuffer byteBuffer = ByteBuffer.wrap(byteOutputStream.toByteArray());
CharBuffer document = byteBuffer.asCharBuffer();
您必须提供编码。班级应该如何知道如何转换。您不能在写入 ByteOutputStream 或完全避免流之前确定编码。如果不是,您必须做假设并且可能会失败
提供编码,您可以将字节缓冲区转换为字符缓冲区
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(yourByteBuffer);
ByteBuffer.asCharBuffer
给你一个非常字面byte
的 s to char
(大端或小端),更新反映在两个缓冲区中。
大概你想通过一些合理的编码从byte
s 到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)
ByteBuffer.asCharBuffer()
假定字节为 UTF-16。(我在文档中找不到任何明确说明这一点的内容,但实现只是将字节对视为字符的低字节和高字节。)如果您需要另一种编码,则必须使用不同的方法。
最简单的方法是创建一个String
:
CharBuffer document = CharBuffer.wrap(byteOutputStream.toString(encoding));
我知道您说您“试图避免创建新字符串”,但是您的代码片段无论如何都分配了一个单独的字节数组(ByteArrayOutputStream.toByteArray()
根据文档“创建一个新分配的字节数组”)。因为CharBuffer
支持随机访问并且许多编码(尤其是 UTF-8)是可变宽度的,所以最好还是先将整个内容转换为字符。
如果您真的只想对字符进行流式访问(而不是随机访问),那么可能CharBuffer
不是底层代码接受的最佳接口。