![](/img/trans.png)
[英]How to compare two Collections for “equivalence” based on fields from different Java classes?
[英]How does one compare Path equivalence in Java?
給定兩個 Path 對象 p1 和 p2(不一定指向存在的文件),如何檢查底層路徑是否等效? 也就是說,Path 對象產生於
/path/to/something
/path/to/../fdsfaf/something
應該(例如)被視為等效/相同。
我目前的方法是
這兩種方法會導致相同的結果嗎? 我試圖閱讀文檔,我目前的猜測是結果應該是一樣的。
編輯:多人建議以下文章回答我的問題。 我聲稱這是不正確的,因為它只解釋了為什么 Files.isSameFile() 與 Path#equals() 不同。 問題(或其答案)不考慮 .normalize() 是否相關。 Java NIO - Files.isSameFile 與 Path.equals 有何不同
在相對路徑或重解析點的情況下,上述方法之間存在差異:
Files.isSameFile
進行深度檢查,例如在 Windows 下,它會打開兩個文件並比較該卷中的卷 ID 和文件系統索引。 因此它可以處理重解析點、相對路徑、冗余路徑元素甚至硬鏈接(指向相同文件內容的不同文件記錄)。 有一些用於 Windows 的反編譯字節碼(我相信其他系統也會類似):public class WindowsFileSystemProvider extends AbstractFileSystemProvider {
...
public boolean isSameFile(Path var1, Path var2) throws IOException {
...
var11 = WindowsFileAttributes.isSameFile(var7, var10);
...
return var11;
...
}
...
}
class WindowsFileAttributes implements DosFileAttributes {
...
static boolean isSameFile(WindowsFileAttributes var0, WindowsFileAttributes var1) {
return var0.volSerialNumber == var1.volSerialNumber && var0.fileIndexHigh == var1.fileIndexHigh && var0.fileIndexLow == var1.fileIndexLow;
}
...
}
Path.normalize
只對不訪問文件系統的路徑字符串進行規范化,因此當當前目錄為“/path”或“C:\\dir”時,它不能匹配“/path/file.ext”和“./file.ext” \\file.ext", "C:file.ext" 和 "\\dir\\file.ext" 在 Windows 下,如果當前目錄是 "C:\\dir",並且它絕對不跟隨鏈接,所以可以考慮不同的路由到同一個文件作為不同的文件。因此,根據您的需求,可能有不止一種足夠的方法:
Path.normalize
應該是安全的。 如果路徑可能是相對的,您應該在規范化之前使用File.getAbsolutePath
,因為規范化不處理它。Files.isSameFile
。Path.toRealPath
方法來解析路徑中的任何重解析點,因此在兩個路徑上應用它應該給出與Files.isSameFile
幾乎相同的結果,但以不同的方式(可能更慢或更快,它也不會匹配硬鏈接,而 Files.isSameFile Files.isSameFile
將)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.