2017-10-06 32 views
1

要我很大的驚喜,下面就jdk1.8.0_u144如何獲取本地文件的正確URI?

public class Tmp { 
    public static void main(String[] args) { 
    File f = new File("."); 
    boolean result = f.toPath().toUri().toString().equals(f.toURI().toString()); 
    System.out.println("result = " + result); 
    } 
} 

顯然,java.io.File#toURIjava.nio.Path#toUri返回不同的演示片斷輸出false。問題是,他們哪一個是正確的(根據RFC 8089)?

+0

File.toURI是正確的。您可以在比較之前通過打印兩個值來手動進行驗證 – Optional

回答

1

TLDR版本:這兩種形式的URI根據RFC 8089是正確的。 ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~

示例代碼突出了Path的toUri()和文件的toURI返回的值之間的差異()給定文件的方法。打印那些值我的Win10機器上顯示:

path.toUri()=>文件:/// d:/NetBeansProjects/MiscTests/./

file.toUri()=>文件:/ d:/的NetBeansProjects/MiscTests /./

Linux上的結果是相似的:

path.toUri()=>文件:///home/johndoe/IdeaProjects/TestUri/./

file.toUri()=>文件:/家庭/輸入johndoe/IdeaProjects/TestUri /./

因此,唯一的區別是單或三正斜槓以下 「文件:」 中的URI。

從你的鏈接,RFC 8089的附錄B中證實,這兩種形式都是有效的URI:

與空權限的本地文件傳統的文件URI。 這是當今最常用的格式。例如:

* "file:///path/to/file" 

ö本地文件與沒有權限 字段 並以斜線「/」開始的絕對路徑的最小表示。例如:

* "file:/path/to/file" 

進一步確認這兩個URI形式都是有效的是,要麼可以在瀏覽器中輸入顯示目錄的內容。不過,也有值得注意的幾點:

  • 勇敢是不會接受的URI的單斜線形式的唯一瀏覽器(通過File.toURI給出()的toString()。)。

  • 所有的瀏覽器接受URI的三重斜線形式(如File.toPath()。toUri()。toString())給出的。

  • 如果我使用單斜槓在瀏覽器的地址欄中輸入URI,它將轉換爲三斜槓。奇怪的是,Chrome和Firefox都會在URI中接受任意數量的斜槓(例如file://///////// D:/ NetBeansProjects/MiscTests /),並且仍然顯示該目錄。

相關問題