Saya pikir Anda dapat memanfaatkan [ Penyedia Sistem File Zip ] [1] untuk mencapai ini. Ketika menggunakanFileSystems.newFileSystem
sepertinya Anda bisa memperlakukan objek dalam ZIP itu sebagai file "biasa".
Dalam dokumentasi tertaut di atas:
Tentukan opsi konfigurasi untuk sistem file zip di objek java.util.Map yang diteruskan ke FileSystems.newFileSystem
metode. Lihat topik [Properti Sistem File Zip] [2] untuk informasi tentang properti konfigurasi khusus penyedia untuk sistem file zip.
Setelah Anda memiliki instance dari sistem file zip, Anda dapat memanggil metode dari kelas [ java.nio.file.FileSystem
] [3] dan [ java.nio.file.Path
] [4] untuk melakukan operasi seperti menyalin, memindahkan, dan mengganti nama file, serta memodifikasi atribut file.
Dokumentasi untuk jdk.zipfs
modul di [Jawa 11 negara] [5]:
Penyedia sistem file zip memperlakukan file zip atau JAR sebagai sistem file dan menyediakan kemampuan untuk memanipulasi konten file. Penyedia sistem file zip dapat dibuat oleh [ FileSystems.newFileSystem
] [6] jika diinstal.
Ini adalah contoh yang dibuat-buat yang saya lakukan menggunakan sumber daya contoh Anda. Perhatikan bahwa a .zip
adalah a.jar
, tetapi Anda dapat mengadaptasi kode Anda untuk menggunakan sumber daya classpath:
Mempersiapkan
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
Jawa
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);
}
}
}
Keluaran
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