500 ~ 1000k のエントリを含む 1 ~ 2GB の zip ファイルがあります。完全に解凍せずに、名前でファイルを数秒で取得する必要があります。ファイルが 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 は、エントリへのランダム アクセスを許可しません。
バイト配列でメモリ内に仮想ファイルを作成できればいいのですが、方法が見つかりませんでした。