我将文件从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
中的a
。 c
是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)
截断路径。为了获得目标路径,需要将源路径转换为字符串,以防止合并两个不同的文件系统。
(我没有处理子目录。)