我不理解java.nio.file.Files.isSameFile方法与java.nio.file.Path.equals方法之间的区别。有人能告诉我它们之间的不同吗?请注意,要保留HTML标记
,
,和。
他们非常不同。
例如:
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
如果且仅当以下条件都满足时,Path
与另一个Path
相等:
FileSystem
;这与Files.isSameFile()
非常不同,后者访问文件系统并尝试查看两个Path
是否指向同一文件系统资源。
equal() == true
,则isSameFile() == true
isSameFile() == true
,则equal()
并不总是true
isSameFile()
方法首先检查Path
对象是否在equal()
方面相等,如果是,则自动返回true而不检查任何一个文件是否存在。
如果Path
对象的equals()
比较返回false,则在文件系统中找到每个路径引用的文件,并确定它们是否相同。如果任何一个文件不存在,则抛出checked IOException
异常。
isSameFile 是来自 java.nio.file.Files 的方法,而 Path.equals 是来自 java.nio.file.Path 的方法。
isSameFile --> 用于测试两个路径是否定位到同一个文件。 即检查两个 Path 对象是否指向同一文件。 equals --> 用于将此路径与给定对象进行比较以测试其相等性。
java.nio.file.Files.isSameFile() 检查两个文件路径是否引用同一个文件,即都是硬链接(这对于所有操作系统和文件系统都是可移植的)。此方法也遍历符号链接,然后可以将两个符号链接与指向 Unix 文件系统/Windows NTFS 上相同 inode 的文件名进行比较。
您可以定位(不可编辑)文件重复项(具有相同大小和内容),确定它们是否为软/硬链接,然后如果不是,则可以保存路径名并删除第一个文件,然后创建到第二个文件的链接。您可以节省 50% 的磁盘空间。
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());
你对此有何看法?
java.nio.file.Path.isSameFile
不存在。您是否指的是 java.nio.file.Files.isSameFile? - Andy Turner