Java:将二进制文件 blob 保存在内存中以供多次使用(byte[]?ByteBuffer?...?)
Java: Keep binary file blob in memory for multiple uses (byte[]? ByteBuffer? ...?)
我从 InputStream
读取二进制文件,必须将它们保存在内存中以供进一步处理。最明显的做法是将每个文件的读取数据保存在一个 byte[]
数组中。但我想有更优雅的方法可以在内存中 "file blobs" 周围提供一些 OO API 。你会推荐什么?
- 无需重建数据结构即可进行多次读取(读取访问不得影响文件 blob 的内部状态)
- (随机)不需要写入权限。无需修改某些字节
- 最终,经过多位访客的检查,将保存在内存中的文件blob写入磁盘
- 仅纯 Java 8,没有像 Apache Commons、Guava 等第三方库
如果所有内容都适合内存并且数据很快被丢弃,请使用 byte[]
s 或非直接 (!) java.nio.ByteBuffer
s(无论如何它们只是字节数组的包装器)。字节缓冲区的优点是您可以使用 asReadOnlyBuffer()
方法提供对同一 blob 的引用,通过它不能对 blob 进行任何更改。使用 byte[]
,这需要一个防御性副本。关于 ByteBuffer
的额外开销:Hotspot 编译器非常善于消除它,而且你的 blob 似乎相当大,所以额外分配应该无关紧要。
我从 InputStream
读取二进制文件,必须将它们保存在内存中以供进一步处理。最明显的做法是将每个文件的读取数据保存在一个 byte[]
数组中。但我想有更优雅的方法可以在内存中 "file blobs" 周围提供一些 OO API 。你会推荐什么?
- 无需重建数据结构即可进行多次读取(读取访问不得影响文件 blob 的内部状态)
- (随机)不需要写入权限。无需修改某些字节
- 最终,经过多位访客的检查,将保存在内存中的文件blob写入磁盘
- 仅纯 Java 8,没有像 Apache Commons、Guava 等第三方库
如果所有内容都适合内存并且数据很快被丢弃,请使用 byte[]
s 或非直接 (!) java.nio.ByteBuffer
s(无论如何它们只是字节数组的包装器)。字节缓冲区的优点是您可以使用 asReadOnlyBuffer()
方法提供对同一 blob 的引用,通过它不能对 blob 进行任何更改。使用 byte[]
,这需要一个防御性副本。关于 ByteBuffer
的额外开销:Hotspot 编译器非常善于消除它,而且你的 blob 似乎相当大,所以额外分配应该无关紧要。