Eu acho que você pode aproveitar o [ Fornecedor do sistema de arquivos zip ] [1] para conseguir isso. Ao usarFileSystems.newFileSystem
lo, parece que você pode tratar os objetos nesse ZIP como um arquivo "regular".
Na documentação vinculada acima:
Especifique as opções de configuração para o sistema de arquivos zip no objeto java.util.Map passado para o FileSystems.newFileSystem
método Consulte o tópico [Propriedades do sistema de arquivos zip] [2] para obter informações sobre as propriedades de configuração específicas do provedor para o sistema de arquivos zip.
Depois de ter uma instância de um sistema de arquivos zip, você pode invocar os métodos das classes [ java.nio.file.FileSystem
] [3] e [ java.nio.file.Path
] [4] para executar operações como copiar, mover e renomear arquivos, bem como modificar os atributos do arquivo.
A documentação para o jdk.zipfs
módulo em [Java 11 states] [5]:
O provedor do sistema de arquivos zip trata um arquivo zip ou JAR como um sistema de arquivos e fornece a capacidade de manipular o conteúdo do arquivo. O provedor do sistema de arquivos zip pode ser criado por [ FileSystems.newFileSystem
] [6], se instalado.
Aqui está um exemplo artificial que eu fiz usando seus recursos de exemplo. Observe que a .zip
é a .jar
, mas você pode adaptar seu código para usar os recursos do caminho de classe:
Configuração
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);
}
}
}
Resultado
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