I could not understand how java.nio.file.Files.isSameFile method is different from java.nio.file.Path.equals method.
Could anybody please tell how they are different?
I could not understand how java.nio.file.Files.isSameFile method is different from java.nio.file.Path.equals method.
Could anybody please tell how they are different?
They are very different.
For instance:
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
is equal to another Path
if and only if:
FileSystem
;This is very different from Files.isSameFile()
which accesses the filesystem and tries and see if two Path
s point to the same filesystem resource.
equal() == true
then isSameFile() == true
isSameFile() == true
, equal()
is not always true
The isSameFile()
method first checks if the Path
objects are equal in terms of equal()
, and if so, it automatically returns true without checking to see if either file exists.
If the Path
object equals()
comparison returns false, then it locates each file to which the path refers in the file system and determines if they are the same, throwing a checked IOException
if either file does not exist.
isSameFile is from java.nio.file.Files and Path.equals is from java.nio.file.Path
isSameFile --> Tests if two paths locate the same file. ie) checks two Path objects are for the same file equals --> Tests this path for equality with the given object.
java.nio.file.Files.isSameFile() checks if two filepaths refers to the same file = i.e. both are hardlinks (this is portable for all OS and filesystems (yeah)). This method traverse symbolic links too then you can compare two symbolic links to filenames points to the same inode on unix filesystem/Windows NTFS.
You can locate (not editable) file duplicates (this same size and content), determines if are soft/hard links then if not - you can save pathname and delete first then create link to second. You can save 50% disk space.
From my point of view java APIs are missing something here... There should be a method to know if two paths are pointing to the same folder/file into the file system. And this should be performed without any access to the file system (put the case one of the paths is not existing, using java.nio.file.Files.isSameFile() you will receive a java.nio.file.NoSuchFileException). On the other hand
Paths.get("/usr/src").equals(Paths.get("/usr/../usr/src"))
will return a false result...
An easy solution for that situation might be the following:
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());
What do you think about it?
toAbsolutePath()
without accessing the filesystem. It can't check if the file exists or not without accessing the filesystem. It can't follow soft links without accessing the file system. It can't check if two wildly different paths are actually hard links to the same file without accessing the file system. –
Atmosphere © 2022 - 2025 — McMap. All rights reserved.
java.nio.file.Path.isSameFile
doesn't exist. Do you mean java.nio.file.Files.isSameFile? – Mckenney