JAVA nio 2 定義 Path 類
一旦確認了檔案系統上的一個檔案或目錄,那麼就可以定義一個 Path 類來指向它。定義 Path 類可以使用絕對路徑、相對路徑、路徑中帶有一個點號“.”(表示當前目錄)、路徑中帶有兩個點“..”(表示上一層目錄)等。定義 Path 類最簡單的方法是呼叫輔助類 Paths 的 get() 方法。下面將介紹使用不同的方式來得到 C:\rafaelnadal\tournaments\2009\BNP.txt 檔案的 Path 物件。
定義絕對路徑
絕對路徑(有時也成為全路徑)是指包含了根目錄以及所有子目錄以及檔名的檔案路徑。在 NIO.2 中定義絕對路徑只需要一行程式碼,下面的例子定義了 C:\rafaelnadal\tournaments\2009 目錄下的 BNP.txt 檔案(測試的時候,這個檔案有可能不存在):
1 | Path path=Paths.get("C:/rafaelnadal/tournaments/2009/BNP.txt"); |
get() 方法也支援將檔案路徑分塊。NIO 將會自動重建檔案路徑。如果你將檔案路徑分塊,那麼你就不用再考慮檔案路徑分隔符。前面的絕對路徑例子中的路徑可以被分塊改寫為:
1 2 3 | Path path=Paths.get("C:/rafaelnadal/tournaments/2009","BNP.txt"); Path path=Paths.get("C:","rafaelnadal/tournaments/2009","BNP.txt"); Path path=Paths.get("C:","rafaelnadal","tournaments","2009","BNP.txt"); |
定義根目錄的相對路徑
相對路徑是絕對路徑中的一部分。相對路徑經常在建立 web 頁面的時候使用。相對路徑比絕對路徑使用更廣泛。定義當前檔案儲存根目錄的相對路徑,此路徑需要由檔案分隔符開始。在下面的例子中,如果當前檔案儲存的根 目錄是 C: ,那麼檔案的絕對路徑就是 C:\rafaelnadal\tournaments\2009\BNP.txt:
1 2 | Path path=Paths.get("/rafaelnadal/tournaments/2009/BNP.txt"); Path path=Paths.get("/rafaelnadal","tournaments/2009/BNP.txt"); |
定義工作目錄的相對路徑
當你定義當前工作目錄的相對路徑的時候,此路徑不需要由檔案分隔符開始。假設你的工作目錄是 C: 根目錄下的 /ATP 目錄,那麼下面的程式碼片段定義的檔案是 C:\ATP\rafaelnadal\tournaments\2009\BNP.txt:
1 2 | Path path=Paths.get("rafaelnadal/tournaments/2009/BNP.txt"); Path path=Paths.get("rafaelnadal","tournaments/2009/BNP.txt"); |
使用萬用字元定義路徑
一般情況下,使用一個點“.”表示當前目錄,使用兩個點“..”表示父目錄這是公認的做法。在 NIO.2 中可以使用 Path.normalize() 方法來消除路徑中的冗餘(即刪除路徑中的 /. 或 /..):
1 2 | Path path=Paths.get("C:/rafaelnadal/tournaments/2009/dummy/../BNP.txt").normalize(); Path path=Paths.get("C:/rafaelnadal/tournaments/./2009/dummy/../BNP.txt").normalize(); |
如果你想看看 normalize() 方法的效果,可以分別列印下面兩行程式碼執行後的路徑:
1 2 | Path noNormalize=Paths.get("C:/rafaelnadal/tournaments/./2009/dummy/../BNP.txt"); Path normalize=Paths.get("C:/rafaelnadal/tournaments/./2009/dummy/../BNP.txt").normalize(); |
使用 System.out.println() 分別列印兩個結果,可以看到 normalize 方法移除了冗餘資訊:
1 2 | C:\rafaelnadal\tournaments\.\2009\dummy\..\BNP.txt C:\rafaelnadal\tournaments\2009\BNP.txt |
使用 URI 定義路徑
在有的情況下,你可能需要從 URI 建立 Path 物件。可以通過 URI.create() 從給定的字串建立 URI 物件,然後將 URI 物件作為引數傳給 Paths.get() 方法。如果你需要將瀏覽器的位址列輸入的資訊封裝進字串的話,這一招非常有用:
1 2 3 4 | import java.net.URI; … Path path=Paths.get(URI.create("file:///rafaelnadal/tournaments/2009/BNP.txt")); Path path=Paths.get(URI.create("file:///C:/rafaelnadal/tournaments/2009/BNP.txt")); |
使用 FileSystems.getDefault().getPath() 定義路徑
另一個建立 Path 物件的通用方法是通過 FileSystem 類。首先呼叫 getDefault() 方法獲得預設 FileSystem—— NIO.2 將會生成可以訪問預設檔案系統的通用物件。然後,呼叫 getPath() 方法(前面例子中使用的 Paths.get() 方式是這種方式的簡寫形式):
1 2 3 4 5 6 7 | import java.nio.file.FileSystems; … Path path=FileSystems.getDefault().getPath("/rafaelnadal/tournaments/2009","BNP.txt"); Path path=FileSystems.getDefault().getPath("/rafaelnadal/tournaments/2009/BNP.txt"); Path path=FileSystems.getDefault().getPath("rafaelnadal/tournaments/2009","BNP.txt"); Path path=FileSystems.getDefault(). getPath("/rafaelnadal/tournaments/./2009","BNP.txt").normalize(); |
獲取 Home 目錄的路徑
當你在需要獲得 Home 目錄的路徑的時候,可以使用下面的樣例程式碼(返回的 Home 目錄依賴不同的機器和不同的作業系統):
1 | Path path=Paths.get(System.getProperty("user.home"),"downloads","game.exe"); |
在我的 Windows 7 機器上,將會返回 C:\Users\Terry\downloads\game.exe,在我的 Linux 上,將會返回 /home/Terry/downloads/game.exe。