2

可以java.nio.file.FileSystem为 zip 文件中的 zip 文件创建一个吗?

如果是这样,URI 是什么样的?

如果没有,我假设我将不得不回退到使用 ZipInputStream。

我正在尝试递归到下面的方法。当前实现创建了一个 URI“jar:jar:...”。我知道那是错误的(并且是对电影角色的潜在创伤性提醒)。应该是什么?

private static void traverseZip(Path zipFile ) {
    // Example: URI uri = URI.create("jar:file:/codeSamples/zipfs/zipfstest.zip");
    
    String sURI = "jar:" + zipFile.toUri().toString();
    URI uri = URI.create(sURI);

    Map<String, String> env = new HashMap<>();

    try (FileSystem fs = FileSystems.newFileSystem(uri, env)) {

        Iterable<Path> rootDirs = fs.getRootDirectories();
        for (Path rootDir : rootDirs) {
            traverseDirectory(rootDir ); // Recurses back into this method for ZIP files
        }

    } catch (IOException e) {
        System.err.println(e);
    }
}
4

1 回答 1

2

您可以使用FileSystem.getPath返回一个Path适合用于FileSystems.newFileSystem打开嵌套 ZIP/存档的另一个调用。

例如,这段代码打开一个war文件并读取内部jar文件的内容:

Path war = Path.of("webapps.war");
String pathInWar = "WEB-INF/lib/some.jar";

try (FileSystem fs = FileSystems.newFileSystem(war)) {
    
    Path jar = fs.getPath(pathInWar);

    try (FileSystem inner = FileSystems.newFileSystem(jar)) {
        for (Path root : inner.getRootDirectories()) {
            try (Stream<Path> stream = Files.find(root, Integer.MAX_VALUE, (p,a) -> true)) {
                stream.forEach(System.out::println);
            }
        }
    }
}

另请注意,您的代码可以传入 zipFile 而不更改为 URI:

try (FileSystem fs = FileSystems.newFileSystem(zipFile, env)) {
于 2021-12-17T19:57:44.940 回答