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

时间:2017-12-20 02:26:58

标签: java arrays memory stream

我有一个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()在内存中创建了一个全新的数据副本,我正在努力避免这种情况。有没有办法在不使用额外内存的情况下将流转换为字节数组?

1 个答案:

答案 0 :(得分:2)

内部缓冲区和当前计数是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; }
}