Java:将二进制文件 blob 保留在内存中以供多次使用(byte[]?ByteBuffer?...?)

标签 java file byte in-memory

我从InputStream读取二进制文件,并且必须将它们保存在内存中以供进一步处理。最明显的方法是将每个文件的读取数据保存在一个 byte[] 数组中。但我想有更优雅的方法可以围绕内存中的“文件 blob”提供一些 OO API。您会推荐什么?

  • 必须可以进行多次读取,而无需重建数据结构(读取访问不得影响文件 blob 的内部状态)
  • (随机)不需要写访问权限。无需修改某些字节
  • 最后,经过多个访问者的检查后,保存在内存中的文件 blob 将被写入磁盘
  • 仅限纯 Java 8,无 Apache Commons、Guava 等第三方库。

最佳答案

如果所有内容都适合内存并且数据很快被丢弃,请使用 byte[] 或非直接 (!) java.nio.ByteBuffer(其中无论如何,它们只是字节数组的包装器)。字节缓冲区的优点是,您可以使用 asReadOnlyBuffer() 方法提供对同一 Blob 的引用,但不能对 Blob 进行任何更改。对于byte[],这需要一个防御性副本。关于 ByteBuffer 的额外开销:Hotspot 编译器非常擅长消除这种开销,而且您的 blob 似乎相当大,因此额外的分配应该不重要。

关于Java:将二进制文件 blob 保留在内存中以供多次使用(byte[]?ByteBuffer?...?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45255712/

相关文章:

c++ - 在 C++ 中读取 python UUID 字节字符串?

java - 将字符串解释为打包的二进制数据,Python 与 Java

java - 如果两个实体表之间没有关系,如何连接这些表?

python 3.7 : How can I read a whole file with readlines() except of the first line?

c++ - 实现日志观察器

c - C中的文件创建权限

C++:BOOST-ASIO async_read_some 不返回数据包字节数?

java - EJB @Stateless bean 具有两个使用不同方法的客户端并且 poolsize = 1

java - 在 Firebase Android 中将子值转换为 Java 对象

java - 如何在我的 React JHipster 应用程序中添加 fontawesome 图标?