Myślę, że możesz to zrobić przy użyciu [ Zip System System Provider ] [1]. Podczas używania FileSystems.newFileSystem
wygląda na to, że możesz traktować obiekty w tym pliku ZIP jako „zwykły” plik.
W powiązanej dokumentacji powyżej:
Określ opcje konfiguracji systemu plików zip w obiekcie java.util.Map przekazanym do FileSystems.newFileSystem
metody. Zobacz temat [Właściwości systemu plików Zip] [2], aby uzyskać informacje na temat właściwości konfiguracji specyficznych dla dostawcy dla systemu plików Zip.
Gdy masz już instancję systemu plików zip, możesz wywoływać metody klas [ java.nio.file.FileSystem
] [3] i [ java.nio.file.Path
] [4] w celu wykonywania operacji takich jak kopiowanie, przenoszenie i zmiana nazw plików, a także modyfikowanie atrybutów plików.
Dokumentacja jdk.zipfs
modułu w [stanach Java 11] [5]:
Dostawca systemu plików zip traktuje plik zip lub JAR jako system plików i zapewnia możliwość manipulowania zawartością pliku. Dostawca systemu plików zip można utworzyć za pomocą [ FileSystems.newFileSystem
] [6], jeśli jest zainstalowany.
Oto wymyślony przykład, który wykorzystałem przy użyciu przykładowych zasobów. Zauważ, że a .zip
jest a .jar
, ale możesz dostosować swój kod, aby zamiast tego używał zasobów ścieżki klasy:
Ustawiać
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);
}
}
}
Wynik
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