我想知道如何检查两个不同路径的文件系统是否相等。这样写好像是错误的
path1.fileSystem == path2.fileSystem
因为可能存在这样的情况:文件系统在含义上是相同的(它们完全相同),但实际上是不同的实例,因此当它实际上必须返回
path1.fileSystem == path2.fileSystem
时,false
可能会返回 true
。那我应该如何比较两个不同路径的文件系统呢?或者 ==
实际上没问题并且在这种情况下可以正常工作吗?
我实际上尝试询问 ChatGPT,但它给了我一个奇怪的解决方案,似乎不起作用
boolean sameFileSystem = FileSystems.getDefault().provider().getScheme().equals(path1.getFileSystem().provider().getScheme())
&& FileSystems.getDefault().provider().getScheme().equals(path2.getFileSystem().provider().getScheme());
更新:我需要检查这一点,以便解决一条路径与另一条路径的冲突 (如果文件系统不一样我就做点别的,这部分是无关紧要的?我只需要检查它们是否相同)
如果您想知道是否可以安全地调用两个现有 .resolve(Path)
实例的
Path
,您必须检查这两个路径是否属于同一个 provider,而不是文件系统。
可以使用
==
运算符来比较提供商;他们应该是单身人士。
Files.copy(…)
检查两个路径是否属于同一个文件系统提供程序的方式:
public static Path copy(Path source, Path target, CopyOption... options) throws IOException { FileSystemProvider provider = provider(source); if (provider(target) == provider) { // same provider provider.copy(source, target, options); } else { // different providers CopyMoveHelper.copyToForeignTarget(source, target, options); } return target; }
…
private static FileSystemProvider provider(Path path) { return path.getFileSystem().provider(); }
在大多数情况下,当您需要使用不同文件系统提供程序的路径进行解析时,可以使用
.resolve(String)
进行回退:
static Path resolveWithForeignSupport(Path base, Path other) {
FileSystem fs1 = base.getFileSystem(), fs2 = other.getFileSystem();
if(fs1.provider() == fs2.provider()) {
return base.resolve(other);
}
if(other.getNameCount() <= 1 || fs1.getSeparator().equals(fs2.getSeparator())){
return base.resolve(other.toString());
}
Path resolved = base, othersRoot = other.getRoot();
if(othersRoot != null) {
resolved = resolved.resolve(othersRoot.toString());
}
for(Path component: other) {
resolved = resolved.resolve(component.toString());
}
return resolved;
}