gpt4 book ai didi

java - 为什么当我尝试 .relativize() 一个 Path 而不是另一个 Path 时会得到 ProviderMismatchException?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:55 24 4
gpt4 key购买 nike

[注意:自答题]

我已经使用 java.nio 打开了一个压缩文件的 FileSystem。我从那个文件系统得到了一个路径:

final Path zipPath = zipfs.getPath("path/into/zip");

现在我在本地文件系统上有了一个目录,我使用以下方法获得了该目录:

final Path localDir = Paths.get("/local/dir")

我想测试 /local/dir/path/into/zip 是否存在,所以我使用以下方法检查它是否存在:

Files.exists(localDir.resolve(zipPath))

但我得到一个 ProviderMismatchException。为什么?我该如何解决这个问题?

最佳答案

此行为已记录在案,尽管它不是很明显。你必须深入研究 java.nio.file package description在最后看到:

Unless otherwise noted, invoking a method of any class or interface in this package created by one provider with a parameter that is an object created by another provider, will throw ProviderMismatchException.

这种行为的原因可能并不明显,但考虑例如两个文件系统可以定义一个 different separator .

JDK 中没有可以帮助您的方法。如果您的文件系统使用相同的分隔符,那么您可以使用以下方法解决此问题:

path1.resolve(path2.toString())

否则这个实用方法可以帮助:

public static Path pathTransform(final FileSystem fs, final Path path)
{
Path ret = fs.getPath(path.isAbsolute() ? fs.getSeparator() : "");
for (final Path component: path)
ret = ret.resolve(component.getFileName().toString());
return ret;
}

那么上面可以写成:

final Path localPath = pathTransform(localDir.getFileSystem(), zipPath);
Files.exists(localDir.resolve(localPath));

关于java - 为什么当我尝试 .relativize() 一个 Path 而不是另一个 Path 时会得到 ProviderMismatchException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22611919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com