[ Zip File System Provider ] [1]を利用してこれを実現できると思います。使用する場合FileSystems.newFileSystem
と、そのZIP内のオブジェクトを「通常の」ファイルとして扱うことができます。
上記のリンクされたドキュメントでは:
に渡されるjava.util.Mapオブジェクトでzipファイルシステムの構成オプションを指定します。 FileSystems.newFileSystem
メソッドに。zipファイルシステムのプロバイダー固有の構成プロパティについては、[Zipファイルシステムのプロパティ] [2]トピックを参照してください。
zipファイルシステムのインスタンスを取得したら、[ java.nio.file.FileSystem
] [3]および[ java.nio.file.Path
] [4]クラスのメソッドを呼び出して、ファイルのコピー、移動、名前の変更、ファイル属性の変更などの操作を実行できます。
jdk.zipfs
[Java 11の状態] [5] のモジュールのドキュメント:
zipファイルシステムプロバイダーは、zipまたはJARファイルをファイルシステムとして扱い、ファイルのコンテンツを操作する機能を提供します。FileSystems.newFileSystem
インストールされている場合、zipファイルシステムプロバイダーは[ ] [6] で作成できます。
これは、サンプルリソースを使用して私が作成した不自然な例です。a .zip
はですが、.jar
代わりにクラスパスリソースを使用するようにコードを調整できます。
セットアップ
cd /tmp
mkdir -p x/y/z
touch x/y/z/{a,b,c}.html
echo 'hello world' > x/y/z/d
zip -r example.zip x
ジャワ
import java.io.IOException;
import java.net.URI;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.util.Collections;
import java.util.stream.Collectors;
public class MkobitZipRead {
public static void main(String[] args) throws IOException {
final URI uri = URI.create("jar:file:/tmp/example.zip");
try (
final FileSystem zipfs = FileSystems.newFileSystem(uri, Collections.emptyMap());
) {
Files.walk(zipfs.getPath("/")).forEach(path -> System.out.println("Files in zip:" + path));
System.out.println("-----");
final String manifest = Files.readAllLines(
zipfs.getPath("x", "y", "z").resolve("d")
).stream().collect(Collectors.joining(System.lineSeparator()));
System.out.println(manifest);
}
}
}
出力
Files in zip:/
Files in zip:/x/
Files in zip:/x/y/
Files in zip:/x/y/z/
Files in zip:/x/y/z/c.html
Files in zip:/x/y/z/b.html
Files in zip:/x/y/z/a.html
Files in zip:/x/y/z/d
-----
hello world