【问题标题】:ByteArrayOutputStream to CharBufferByteArrayOutputStream 到 CharBuffer
【发布时间】:2009-05-06 20:12:31
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java encoding bytearrayoutputstream


    【解决方案1】:

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

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

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

    【讨论】:

    • 我可以设置编码,但是我在哪里设置它以获得一个字符缓冲区。
    【解决方案2】:

    ByteBuffer.asCharBuffer 为您提供了两个 bytes 到 char(大端或小端),更新反映在两个缓冲区中。

    大概你想通过一些合理的编码从bytes 到chars。有很多方法可以做到这一点。例如 [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)

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • 我继续使用字符串并废弃了字符缓冲区。但是,我喜欢你在那里所做的。我忘记了 byteoutputstream 上的 toString。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 2011-12-11
      • 1970-01-01
      • 2011-02-12
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多