我将文件从jar复制到本地文件夹。


罐子位于a/b
我要提取的文件夹(在jar中)位于b/c
目标文件夹应为z,即a/b/c/x-> z/x


当我使用c.relativize("x")时,我得到的是../c/x而不是x

当我然后尝试执行时,这是一个问题:z.resolve(c.relativize(x))

我得到z/../c/x而不是z/x

如何解决此问题?

我尝试了z.resolve(c.relativize(x).normalise())但得到了相同的结果

该jar位于文件夹b中的ac是jar b内部的资源(文件夹)。 x是文件夹c中的文件。

最佳答案

该罐子位于文件夹A / B /
jar内的源文件夹路径为/ b / c /,文件为/b/c/xxx.yyy
目标文件夹为Z
目标文件应具有路径:Z / xxx.yyy


所以:

    Path sourceZip = Paths.get("/A/B/my.zip");
    URI sourceZipURI = URI.create("jar:" + sourceZip.toUri());

    Path targetFolder = Paths.get("/Z");

    Map<String, Object> senv = new HashMap<>();
    try (FileSystem sourceZipFS = FileSystems.newFileSystem(sourceZipURI, senv, null)) {
        Path folderInZip = sourceZipFS.getPath("/b/c");
        Files.list(folderInZip).forEach(p -> {
            Path target = targetFolder.resolve(folderInZip.relativize(p).toString());
            try {
                Files.createDirectories(target.getParent());
                Files.copy(p, target);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }


主要问题是relativize的反转。不是我第一次遇到误会。 child.relativize(parent)给出..,而parent.relativize(child)截断路径。

为了获得目标路径,需要将源路径转换为字符串,以防止合并两个不同的文件系统。

(我没有处理子目录。)

07-28 01:23