Java 当我尝试将一条路径与另一条路径进行.relative()比较时,为什么会出现ProviderMismatchException?
[注:自答问题] 我已经使用java.nio打开了一个Java 当我尝试将一条路径与另一条路径进行.relative()比较时,为什么会出现ProviderMismatchException?,java,java-7,java.nio.file,Java,Java 7,Java.nio.file,[注:自答问题] 我已经使用java.nio打开了一个文件系统到一个zip文件。我从该文件系统获得了一个路径: final Path zipPath = zipfs.getPath("path/into/zip"); 现在,我在本地文件系统上有一个目录,我使用以下方法获得该目录: final Path localDir = Paths.get("/local/dir") 我想测试/local/dir/path/into/zip>是否存在,因此我使用以下方法检查其存在: Files.exist
文件系统
到一个zip文件。我从该文件系统获得了一个路径
:
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
。为什么?如何修复此问题?此行为已记录在案,尽管不太明显。您必须深入研究,在结尾处看到:
除非另有说明,否则调用此包中由一个提供程序创建的任何类或接口的方法时,如果参数是由另一个提供程序创建的对象,则会引发ProviderMistMatchException
这种行为的原因可能并不明显,但是例如,考虑两个文件系统可以定义一个.< /p>
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));
我无法让它工作。为什么循环中的组件变量从未使用过?您忘了将返回类型设置为Path
,并在isAbsolute()
和getSeparator()
之后添加括号。因此,ret
是一个提供者的Path
和另一个提供者的Path
。如果您想使用返回路径的组件.getFileName()
解析它们,那么您仍然会得到ProviderMismatchException
,不是吗?@Genhis sigh我忘了.toString()
在之后