Penso che tu possa sfruttare il [ Zip File System Provider ] [1] per raggiungere questo obiettivo. Quando lo usi FileSystems.newFileSystem
sembra che tu possa trattare gli oggetti in quel ZIP come un file "normale".
Nella documentazione collegata sopra:
Specificare le opzioni di configurazione per il file system zip nell'oggetto java.util.Map passato a FileSystems.newFileSystem
metodo. Consultare l'argomento [Proprietà del file system zip] [2] per informazioni sulle proprietà di configurazione specifiche del provider per il file system zip.
Una volta che hai un'istanza di un file system zip, puoi invocare i metodi delle classi [ java.nio.file.FileSystem
] [3] e [ java.nio.file.Path
] [4] per eseguire operazioni come la copia, lo spostamento e la ridenominazione dei file, nonché la modifica degli attributi dei file.
La documentazione per il jdk.zipfs
modulo in [stati Java 11] [5]:
Il provider del file system zip considera un file zip o JAR come un file system e offre la possibilità di manipolare il contenuto del file. Il provider del file system zip può essere creato da [ FileSystems.newFileSystem
] [6] se installato.
Ecco un esempio inventato che ho fatto usando le tue risorse di esempio. Si noti che a .zip
è a .jar
, ma è possibile adattare il codice per utilizzare invece le risorse del percorso di classe:
Impostare
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
Giava
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);
}
}
}
Produzione
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