Java中的内存映射zip文件

bka*_*ase 7 java file-io zip android

这是我试图解决的问题:

我有大约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

Mat*_*lis 1

我现在会使用像RandomAccessFile这样的简单 api,如果您确实需要的话,我会重新讨论这个问题。

编辑-我不知道MappedByteBuffer。这似乎是要走的路。为什么不先对单独的文件执行此操作,然后再考虑将它们组合起来?