Creo que puede aprovechar el [ Proveedor del sistema de archivos Zip ] [1] para lograr esto. Cuando se usa FileSystems.newFileSystem
parece que puede tratar los objetos en ese ZIP como un archivo "normal".
En la documentación vinculada arriba:
Especifique las opciones de configuración para el sistema de archivos zip en el objeto java.util.Map pasado al FileSystems.newFileSystem
método. Consulte el tema [Propiedades del sistema de archivos zip] [2] para obtener información sobre las propiedades de configuración específicas del proveedor para el sistema de archivos zip.
Una vez que tenga una instancia de un sistema de archivos zip, puede invocar los métodos de las clases [ java.nio.file.FileSystem
] [3] y [ java.nio.file.Path
] [4] para realizar operaciones como copiar, mover y renombrar archivos, así como modificar los atributos del archivo.
La documentación para el jdk.zipfs
módulo en [Java 11 estados] [5]:
El proveedor del sistema de archivos zip trata un archivo zip o JAR como un sistema de archivos y proporciona la capacidad de manipular el contenido del archivo. El proveedor del sistema de archivos zip puede ser creado por [ FileSystems.newFileSystem
] [6] si está instalado.
Aquí hay un ejemplo artificial que hice usando sus recursos de ejemplo. Tenga en cuenta que a .zip
es a .jar
, pero podría adaptar su código para utilizar recursos classpath:
Preparar
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);
}
}
}
Salida
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