我有一个 1-2GB 的 zip 文件,其中包含 500-1000k 个条目。我需要在几分之一秒内按名称获取文件,而无需完全解包。如果文件存储在 HDD 上,则可以正常工作:
public class ZipMapper {
private HashMap<String,ZipEntry> map;
private ZipFile zf;
public ZipMapper(File file) throws IOException {
map = new HashMap<>();
zf = new ZipFile(file);
Enumeration<? extends ZipEntry> en = zf.entries();
while(en.hasMoreElements()) {
ZipEntry ze = en.nextElement();
map.put(ze.getName(), ze);
}
}
public Node getNode(String key) throws IOException {
return Node.loadFromStream(zf.getInputStream(map.get(key)));
}
}
但是,如果程序从 Amazon S3 下载了 zip 文件并具有其 InputStream(或字节数组),我该怎么办?虽然下载 1GB 需要大约 1 秒,但将其写入 HDD 可能需要一些时间,而且处理多个文件稍微困难一些,因为我们没有 HDD 垃圾收集器。
ZipInputStream 不允许随机访问条目。
通过字节数组在内存中创建一个虚拟文件会很好,但我找不到办法。