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() == true
,equal()
并不总是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.
我无法理解 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() == true
,equal()
并不总是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.