Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我尝试将一条路径与另一条路径进行.relative()比较时,为什么会出现ProviderMismatchException?_Java_Java 7_Java.nio.file - Fatal编程技术网

Java 当我尝试将一条路径与另一条路径进行.relative()比较时,为什么会出现ProviderMismatchException?

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

[注:自答问题]

我已经使用java.nio打开了一个
文件系统
到一个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()
之后