0

Java 7 の zip ファイルは、ファイル システムと同様に扱うことができます:
http://fahdshariff.blogspot.cz/2011/08/java-7-working-with-zip-files.html

私のプロジェクトでは、リソースに保存されている zip ファイルを処理したいと考えています。しかし、最初にそのファイルをディスクに保存せずに、リソース ストリーム (getResourceAsStream) を新しい FileSystems オブジェクトに直接変換する効率的な方法を見つけることができません。

Map<String, String> nameMap = new HashMap<>();
Path path = Files.createTempFile(null, ".zip");
Files.copy(MyClass.class.getResourceAsStream("/data.zip"), path, StandardCopyOption.REPLACE_EXISTING);

try (FileSystem zipFileSystem = FileSystems.newFileSystem(path, null)) {

    Files.walkFileTree(zipFileSystem.getPath("/"), new NameMapParser(nameMap));
}
Files.delete(path);

何か不足していますか?

4

1 に答える 1

2

いいえ、これは不可能です。この理由は、a) ストリームはしばしば 2 回読み取ることができないため、b) ZIP アーカイブはランダムな読み取りが必要になるためです。

ファイルのリストは末尾に添付されているため、データをスキップしてファイル エントリを検索し、データ エントリの位置を特定してから逆方向にシークする必要があります。

これが、Java WebStart のようなコードがファイルをダウンロードしてキャッシュする理由です。

ただし、ZIP アーカイブをディスクに書き込む必要はないことに注意してください。ShrinkWrapを使用して、インメモリ ファイルシステムを作成できます。

于 2013-09-02T15:46:09.403 に答える