【问题标题】:Java multiple objects reading different parts of same file [closed]Java多个对象读取同一文件的不同部分[关闭]
【发布时间】:2015-06-05 05:47:11
【问题描述】:

我正在做一个项目,我将有一个二进制文件。该文件分为多个部分,每个部分代表一个原始值列表。我需要一个可以拥有一组对象的解决方案,每个对象代表文件的一部分。然后这些集合都保存在一个“文件”对象中,该对象代表整个文件。

每个集合对象都需要提供对文件表示部分中每个值的顺序访问。什么方法可以在不先将所有数据加载到内存的情况下提供最快的数据检索?

如果同一个“文件”对象的两个单独集合可以被两个单独的线程访问,那就太好了,但这并不重要。

【问题讨论】:

  • 取决于您作为系统默认设置的字符集...请也提供...
  • @CoderNeji 他说是二进制文件。
  • “相当大”有多大?您很可能会发现,追求效率会在代码和维护方面花费大量精力,而这最终并不值得。
  • @TroyStopera 大多数格式为“什么是最好的......”“我应该这样做还是那样”等的问题都已关闭。您有 3 个潜在的解决方案(尽管我无法理解 Inputstream 在那里),所以您的问题基本上是“您能为我决定吗”,而线程问题是一个完全独立的问题。然而,为了避免再把它串起来,FileChannel 将是最现代和最快的方法(因为它可以立即内存映射部分)。
  • @Kayaman 现在应该在哪里提出这样的问题?我开始对这么快失去兴趣,因为像这样的问题我觉得真的很有趣——而不是“为什么这会导致 NPE?”和类似的。

标签: java java-io


【解决方案1】:

一个好的方法是将解决方案划分为多个层,这里:一个用于文件 i/o,将字节映射到 Java 短片和整数,另一个用于文件部分和整个文件的抽象。

java.nio 的 MappedByteBuffer 在随机访问文件的“字节数组”和从中获取 Java 类型数据所需的内容之间提供了一个很好的接口。

正如 Kayaman 所提到的,FileChannel.map() 返回一个 MappedByteBuffer,您可以使用它的方法轻松导航。

实现应该利用操作系统特性将内存页面映射到文件页面,实际上只访问你在内存中真正访问的文件。 (我最近在 Java 8 和 Linux 上使用过它,它在文件甚至超过单个 MappedByteBuffer 的容量时表现良好。)

【讨论】:

  • 正如我上面所说:这将非常有效,正是我所需要的!谢谢!
  • TroyStopera:部分感谢@Kayaman,他推动我将所有内容收集到这个答案中。祝你好运!
猜你喜欢
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多