将字节流转换为字节数组,无需额外空间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将字节流转换为字节数组,无需额外空间相关的知识,希望对你有一定的参考价值。

我有一个ByteArrayOutputStream,它写入了大量数据,最终转换为字节数组并写入缓存:

try {
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      try (JsonGenerator jg = mapper.getFactory().createGenerator(baos)) {
        for (Object result : results) {
          jg.writeObject(result);
        }
      }

      localCache.put(cacheKey, baos.toByteArray());
    }
    catch (IOException e) {
      throw Throwables.propagate(e);
    } 

在这里,baos.toByteArray()在内存中创建了一个全新的数据副本,我试图避免这种情况。有没有办法将流转换为字节数组而不使用额外的内存?

答案

内部缓冲区和当前计数是Javadoc中记录的protected字段。这意味着您可以将ByteArrayOutputStream子类化并提供byte[] getBuffer()方法直接访问缓冲区。使用现有的size()方法确定存在多少数据。

public class MyBAOS extends ByteArrayOutputStream
{
    public MyBAOS()           { super(); }
    public MyBAOS(int size)   { super(size); }
    public byte[] getBuffer() { return buf; }
}

以上是关于将字节流转换为字节数组,无需额外空间的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 8 应用程序中转换字节数组以产生不同的音频声音

使用校验和将字节数组转换为字符串。在 python 中重新迭代时获取额外的空字节

技术分享:Java 序列化

Java IO

Java中字节流如何转字符流,OutputStreamWriter用法

python——pickle模块的详解