簡體   English   中英

如何比較 Java 中的 Path 等價性?

[英]How does one compare Path equivalence in Java?

給定兩個 Path 對象 p1 和 p2(不一定指向存在的文件),如何檢查底層路徑是否等效? 也就是說,Path 對象產生於

/path/to/something
/path/to/../fdsfaf/something

應該(例如)被視為等效/相同。

我目前的方法是

  1. 使用 Files.isSameFile
  2. 首先在每個 Path 對象上應用 .normalize() ,然后在新路徑之一上使用 .equals 。

這兩種方法會導致相同的結果嗎? 我試圖閱讀文檔,我目前的猜測是結果應該是一樣的。

編輯:多人建議以下文章回答我的問題。 我聲稱這是不正確的,因為它只解釋了為什么 Files.isSameFile() 與 Path#equals() 不同。 問題(或其答案)不考慮 .normalize() 是否相關。 Java NIO - Files.isSameFile 與 Path.equals 有何不同

在相對路徑或重解析點的情況下,上述方法之間存在差異:

  1. 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;
    }

    ...
}
  1. Path.normalize只對不訪問文件系統的路徑字符串進行規范化,因此當當前目錄為“/path”或“C:\\dir”時,它不能匹配“/path/file.ext”和“./file.ext” \\file.ext", "C:file.ext" 和 "\\dir\\file.ext" 在 Windows 下,如果當前目錄是 "C:\\dir",並且它絕對不跟隨鏈接,所以可以考慮不同的路由到同一個文件作為不同的文件。

因此,根據您的需求,可能有不止一種足夠的方法:

  1. 如果您需要最快的方式並且知道沒有重解析點並且兩條路徑都是絕對路徑,那么對兩條路徑使用Path.normalize應該是安全的。 如果路徑可能是相對的,您應該在規范化之前使用File.getAbsolutePath ,因為規范化不處理它。
  2. 如果您必須絕對確定兩個路徑都指向同一個文件,請使用Files.isSameFile
  3. 您還可以使用Path.toRealPath方法來解析路徑中的任何重解析點,因此在兩個路徑上應用它應該給出與Files.isSameFile幾乎相同的結果,但以不同的方式(可能更慢或更快,它也不會匹配硬鏈接,而 Files.isSameFile Files.isSameFile將)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM