java - Java 中的内存映射 zip 文件

标签 java android file-io zip

这是我要解决的问题:

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

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

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

更好的方法是将文件映射到内存,这样表格就不必按照串联的顺序排列,因为内存映射文件可以随机访问(如果我错了,请再次纠正我) .

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

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

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

是否有内存映射 zip 文件以便快速读取?或者对于这个读取所选文件的问题有不同的解决方案吗?

谢谢

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

文件数:25(24 用于解析,因为垃圾收集中断计时)
总打开时间:72ms
总关闭时间:1ms
总解析时间:515ms

(这对 Parse 有利,因为 Parse 缺少一个文件)
%打开总时间:12%
%总关闭时间:0.17%
%Total time Parse takes: 88%

打开每个文件的平均时间:2.88ms
平均关闭每个文件的时间:0.04ms
每个文件的平均解析时间:21.46ms

最佳答案

我会使用像 RandomAccessFile 这样的简单 API现在,如果您确实需要,请重新审视该问题。

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

关于java - Java 中的内存映射 zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5251258/

相关文章:

c++ - _stat 返回不可能的 errno 代码 132

android - 如何在 Android 9+ 中以编程方式接听或拒绝来电?

c++ - 标准 C++ 中的事务性文件保存

java - 什么是已弃用的注释目标 - 实现、接口(interface)或两者?

java - Java 中的无限 do..while 循环

java - 为什么幻灯片不能在使用 Swing 和 Awt 的 Java 中运行?

java - 为什么 Java 通常被拼写为 JAVA(通常在旧文本中)?

android - 将来自服务器的数据以 JSON 形式存储到 Android Sqlite 数据库中

android - 如何在 onDraw 方法之外获取自定义 View 的 Canvas 大小?

java - 如何将 SourceDataLine 的内容写入文件?