我有一个输入ByteArrayOutputStream,需要将其转换为CharBuffer。
我试图避免创建一个新字符串。无论如何都要这样做。
我试图执行以下操作,但我没有字符串的编码,因此下面的代码无效(输出无效)。
ByteBuffer byteBuffer = ByteBuffer.wrap(byteOutputStream.toByteArray());
CharBuffer document = byteBuffer.asCharBuffer();
答案 0 :(得分:2)
您必须提供编码。班级应该如何知道如何转换。在写入ByteOutputStream或完全避免流之前,无法确定编码。如果不是,你必须做假设并且可能会失败
提供编码,您可以将字节缓冲区转换为字符缓冲区
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(yourByteBuffer);
答案 1 :(得分:0)
ByteBuffer.asCharBuffer
为byte
(大或小端)提供了两个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
可能不是底层代码可以接受的最佳界面。