我有一个输入ByteArrayOutputStream,需要将其转换为CharBuffer。
我试图避免创建新的字符串。有没有办法做到这一点。
我正在尝试执行以下操作,但我没有字符串的编码,因此下面的代码将无法工作(无效输出)。
ByteBuffer byteBuffer = ByteBuffer.wrap(byteOutputStream.toByteArray());
CharBuffer document = byteBuffer.asCharBuffer();发布于 2009-05-06 20:16:41
您必须提供一种编码。类应该如何知道如何转换。在写入ByteOutputStream或完全避免流之前,您不能确定编码吗?如果没有,你必须做一些假设,并且可能会失败。
通过提供编码,您可以将字节缓冲区转换为字符缓冲区
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(yourByteBuffer);发布于 2009-05-06 21:07:50
ByteBuffer.asCharBuffer给你一个非常字面上的两个bytes to char (大端或小端),更新反映在两个缓冲区中。
您可能希望通过一些合理的编码从bytes转换到chars。有很多方法可以做到这一点。例如新字符串(byte[],字符串编码)。大多数情况下,它们会以某种形式通过CharsetEncoder。那么从那里获取一个CharBuffer应该是很简单的。
CharBuffer是一种相当低级的东西。你确定这真的是你想要的吗?
1:http://file:///C:/Users/tackline/sun/docs/api/java/lang/String.html#String(byte[]
发布于 2009-05-06 21:11:28
ByteBuffer.asCharBuffer()假设字节为UTF-16。(我在文档中找不到明确说明这一点的任何内容,但实现只是将字节对视为字符的低字节和高字节。)如果您需要另一种编码,则必须使用不同的方法。
最简单的方法是只创建一个String
CharBuffer document = CharBuffer.wrap(byteOutputStream.toString(encoding));我知道您说过您“试图避免创建新的字符串”,但是您的代码片段还是分配了一个单独的字节数组(根据文档,ByteArrayOutputStream.toByteArray()“创建了一个新分配的字节数组”)。因为CharBuffer支持随机访问,并且许多编码(特别是UTF-8)是可变宽度的,所以最好还是先把整个代码转换成字符。
如果您真的只想对字符进行流式访问(而不是随机访问),那么对于底层代码来说,CharBuffer可能不是最好的接口。
https://stackoverflow.com/questions/831511
复制相似问题