Je pense que vous pouvez utiliser le [ Fournisseur de système de fichiers Zip ] [1] pour y parvenir. Lors de son utilisation, FileSystems.newFileSystem
il semble que vous puissiez traiter les objets de ce fichier ZIP comme un fichier "normal".
Dans la documentation liée ci-dessus:
Spécifiez les options de configuration du système de fichiers zip dans l'objet java.util.Map transmis à la FileSystems.newFileSystem
méthode. Consultez la rubrique [Propriétés du système de fichiers zip] [2] pour plus d'informations sur les propriétés de configuration spécifiques au fournisseur pour le système de fichiers zip.
Une fois que vous disposez d'une instance d'un système de fichiers zip, vous pouvez appeler les méthodes des classes [ java.nio.file.FileSystem
] [3] et [ java.nio.file.Path
] [4] pour effectuer des opérations telles que la copie, le déplacement et le changement de nom des fichiers, ainsi que la modification des attributs de fichier.
La documentation du jdk.zipfs
module dans [États Java 11] [5]:
Le fournisseur de système de fichiers zip traite un fichier zip ou JAR comme un système de fichiers et offre la possibilité de manipuler le contenu du fichier. Le fournisseur du système de fichiers zip peut être créé par [ FileSystems.newFileSystem
] [6] s'il est installé.
Voici un exemple artificiel que j'ai fait en utilisant vos ressources d'exemple. Notez que a .zip
est un .jar
, mais vous pouvez adapter votre code pour utiliser à la place des ressources de chemin de classe:
Installer
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);
}
}
}
Production
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