Ich denke, Sie können den [ Zip File System Provider ] [1] nutzen, um dies zu erreichen. Wenn FileSystems.newFileSystem
Sie es verwenden, können Sie die Objekte in dieser ZIP-Datei als "normale" Datei behandeln.
In der oben verlinkten Dokumentation:
Geben Sie die Konfigurationsoptionen für das Zip-Dateisystem im Objekt java.util.Map an, das an übergeben wird FileSystems.newFileSystem
Methode übergeben wird. Informationen zu den anbieterspezifischen Konfigurationseigenschaften für das Zip-Dateisystem finden Sie im Thema [Eigenschaften des Zip-Dateisystems] [2].
Sobald Sie eine Instanz eines Zip-Dateisystems haben, können Sie die Methoden der Klassen [ java.nio.file.FileSystem
] [3] und [ java.nio.file.Path
] [4] aufrufen , um Vorgänge wie das Kopieren, Verschieben und Umbenennen von Dateien sowie das Ändern von Dateiattributen auszuführen.
Die Dokumentation für das jdk.zipfs
Modul in [Java 11-Zustände] [5]:
Der Zip-Dateisystemanbieter behandelt eine Zip- oder JAR-Datei als Dateisystem und bietet die Möglichkeit, den Inhalt der Datei zu bearbeiten. Der Zip-Dateisystemanbieter kann FileSystems.newFileSystem
bei Installation von [ ] [6] erstellt werden.
Hier ist ein erfundenes Beispiel, das ich mit Ihren Beispielressourcen erstellt habe. Beachten Sie, dass a a .zip
ist.jar
, aber Sie können Ihren Code anpassen, um stattdessen Klassenpfadressourcen zu verwenden:
Konfiguration
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
Java
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);
}
}
}
Ausgabe
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