12

[注:自答题]

我已经FileSystem使用 java.nio 打开了一个 zip 文件。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. 为什么?我该如何解决?

4

1 回答 1

14

此行为已记录在案,尽管它不是很明显。您必须深入研究java.nio.file包描述才能在最后看到:

除非另有说明,否则调用由一个提供者创建的此包中任何类或接口的方法,其参数是另一个提供者创建的对象,将引发 ProviderMismatchException。

这种行为的原因可能并不明显,但请考虑例如两个文件系统可以定义不同的 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));
于 2014-03-24T14:15:40.737 回答