Java NIO - Files.isSameFile 与 Path.equals 有何不同

Java NIO - How is Files.isSameFile different from Path.equals

我无法理解 java.nio.file.Files.isSameFile 方法与 java.nio.file.Path.equals 方法有何不同。

谁能告诉我它们有何不同?

它们非常不同。

例如:

final Path p1 = Paths.get("/usr/src");
final Path p2 = Paths.get("/usr/../usr/src");

p1.equals(p2); // FALSE
Files.isSameFile(p1, p2); // true

final Path p1 = fs1.getPath("/usr/src");
final Path p2 = fs2.getPath("/usr/src");

p1.equals(p2); // FALSE

A Path 等于另一个 Path 当且仅当:

  • 他们有相同的 FileSystem;
  • 它们具有相同的根元素;
  • 它们具有相同名称的元素。

这与访问文件系统并尝试查看两个 Path 是否指向同一文件系统资源的 Files.isSameFile() 有很大不同。

isSameFile 来自 java.nio.file.Files,Path.equals 来自 java.nio.file.Path

isSameFile --> 测试两个路径是否找到同一个文件。 即)检查两个 Path 对象是否针对同一个文件 equals --> 测试此路径是否与给定对象相等。

  • 如果equal() == true 那么isSameFile() == true
  • 如果isSameFile() == trueequal()并不总是true

isSameFile() 方法首先检查 Path 对象在 equal() 方面是否相等,如果相等,它会自动 returns 为真而不检查是否任一文件都存在。

如果Path对象equals()比较returnsfalse,那么它会在文件系统中定位路径所指的每个文件,并判断它们是否相同,抛出一个checked IOException 如果任一文件都不存在。

java.nio.file.Files.isSameFile() 检查两个文件路径是否引用同一个文件 = 即两者都是硬 links(这对所有 OS 和文件系统都是可移植的(是的))。这种方法也遍历符号 links 然后你可以比较两个符号 links 到文件名指向 unix filesystem/Windows NTFS 上的相同 inode。

您可以定位(不可编辑)文件重复项(大小和内容相同),确定是否为 soft/hard link,如果不是 - 您可以先保存路径名并删除,然后创建 link 到第二个。您可以节省 50% 的磁盘 space.