繁体   English   中英

ByteArrayOutputStream到CharBuffer

[英]ByteArrayOutputStream to CharBuffer

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

我试图避免创建新的字符串。 反正有做到这一点。

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

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

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

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

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

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

大概您想通过某种合理的编码将byte s转换为char 有很多方法可以做到这一点。 例如[new String(byte [],字符串编码)] [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。 (我在文档中找不到明确说明这一点的任何东西,但是实现只将成对的字节视为char的低字节和高字节。)如果需要其他编码,则必须使用其他方法。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM