Java中的内存映射zip文件

这是我试图解决的问题:

我有大约100个二进制文件(总共158KB,它们的大小大致相同+/- 50%)。 我需要有选择地只解析这些文件中的一些(在最坏的情况下可能是50,在其他情况下只有1到5)。 顺便说一句,这是在Android设备上。

在Java中执行此操作的最快方法是什么?

一种方法是将所有内容组合到一个文件中,然后使用文件搜索来获取每个单独的文件。 这样文件打开只需要调用一次,这通常很慢。 但是,为了知道每个文件的位置,需要在文件的开头有某种表 – 可以使用脚本生成 – 但是文件也需要在表中的索引中命令它们被连接起来,因此文件搜索不需要做太多工作(如果我错了,请纠正我)。

更好的方法是使文件内存映射,然后表不必按顺序排序,因为内存映射文件将具有随机访问(如果我错了,再次纠正我)。

如果使用zip压缩,则创建该表将是不必要的,因为zip压缩已经创建了一个表。 此外,所有文件都不必连接。 我可以压缩目录,然后通过zip文件中的条目访问每个单独的文件。 问题解决了。

除非zip文件没有内存映射,否则读取速度会慢一些,因为系统调用比直接内存访问慢(如果我错了,请纠正我)。 所以我得出结论,最好的解决方案是使用内存映射的zip存档。

但是, ZipFile条目返回一个InputStream来读取条目的内容。 并且MappedByteBuffer需要一个RandomAccessFile ,它将文件名作为输入,而不是InputStream

无论如何,内存映射一个zip文件快速读取? 或者是否有一个不同的解决方案来解决这个选择的文件?

谢谢

编辑:我测试了文件的打开,关闭和解析速度这里是我发现的统计数据:

Number of Files: 25 (24 for parse because garbage collection interrupted timing)
Total Open Time: 72ms
Total Close Time: 1ms
Total Parse Time: 515ms

(这有点偏向Parse,因为Parse缺少一个文件)
%Total time Open takes: 12%
%Total time Close takes: 0.17%
%Total time Parse takes: 88%

Avg time Open takes per file: 2.88ms
Avg time Close takes per file: 0.04ms
Avg time Parse takes per file: 21.46ms

我现在会使用像RandomAccessFile这样的简单api,如果你真的需要,请重新审视这个问题。

编辑 – 我不知道MappedByteBuffer 。 这似乎是要走的路。 为什么不首先使用单独的文件,然后再考虑以后将它们组合起来呢?