[注意:自答问题]
我使用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
。为什么?我该如何解决这个问题?
答案 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));