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