当我尝试.relativize()路径对另一个路径时,为什么我会得到ProviderMismatchException?

时间:2014-03-24 14:15:24

标签: java java-7 java.nio.file

[注意:自答问题]

我使用java.nio在zip文件中打开了FileSystem。我从该文件系统中获得了Path

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。为什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:12)

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

  

除非另有说明,否则调用由一个提供程序创建的此包中的任何类或接口的方法,该方法是由另一个提供程序创建的对象,将抛出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));