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

问题描述 投票:0回答:5

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

有人能告诉我他们有什么不同吗?

java java-7 nio
5个回答
26
投票

他们非常不同。

例如:

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
    ;
  • 他们有相同的根元素;
  • 他们有相同的名字元素。

这与访问文件系统并尝试查看两个

Files.isSameFile()
是否指向同一文件系统资源的
Path
有很大不同。


3
投票
  • 如果
    equal() == true
    那么
    isSameFile() == true
  • 如果
    isSameFile() == true
    equal()
    并不总是
    true

isSameFile()
方法首先检查
Path
对象在
equal()
方面是否相等,如果是,它会自动返回 true,而不检查是否存在任何一个文件。

如果

Path
对象
equals()
比较返回 false,则它在文件系统中定位路径引用的每个文件并确定它们是否相同,如果任一文件不存在则抛出
checked IOException


1
投票

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

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


0
投票

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

您可以找到(不可编辑的)文件重复项(大小和内容相同),确定是否是软/硬链接,如果不是 - 您可以先保存路径名并删除,然后创建指向第二个的链接。您可以节省 50% 的磁盘空间。


0
投票

从我的角度来看,Java API 在这里缺少一些东西...... 必须有一种方法可以知道两条路径是否指向文件系统中的同一文件夹/文件。并且这应该在没有对文件系统的任何访问权限的情况下执行(假设其中一个路径不存在,使用 java.nio.file.Files.isSameFile() 您将收到 java.nio.file.NoSuchFileException)。 另一方面

Paths.get("/usr/src").equals(Paths.get("/usr/../usr/src"))

会返回一个错误的结果...

针对这种情况的简单解决方案可能如下:

final Path p1 = Paths.get("/usr/src");
final Path p2 = Paths.get("/usr/../usr/src");
final boolean areEqual = p1.normalize().toAbsolutePath().toString().equalsIgnoreCase(p2.normalize().toAbsolutePath().toString());

你怎么看?

© www.soinside.com 2019 - 2024. All rights reserved.