2017-03-04 34 views
0

我很努力去理解java.nio.file.Path.relativize()方法。我也知道類似的question已被問到,但答案並沒有幫助我理解這個概念。NIO.2:瞭解相對化()方法

考慮下面的代碼片段:

Path path = Paths.get("/Users/somename/documents/Test/cat.html"); 
Path path2 = Paths.get("/documents/Test/cat.html"); 
System.out.println((path.relativize(path2))); //output: ../../../../../documents/Test/cat.html 

誰能給我解釋一下,用一步一步的方法,該方法relativize()如何工作在這個例子嗎?爲什麼我需要上傳5個目錄?

+0

您目前對該方法的目標理解是什麼? –

回答

2

我會在回答結束時回到您的示例。

當涉及到地址/訪問文件和文件夾時,relativize()的目的是獨立於底層文件系統的結構。您不必知道您的應用程序文件夾位於哪個父文件夾/路徑中。你只需要知道你的應用程序相關的文件結構,並可以使用relativize()來訪問可能被放置在完全不同文件夾中的所需文件。

下面是一個例子:

比方說,你已經創建了一個應用程序。你簡單的文件夾結構

/myApp/app/app.java 
/myApp/img/picture1.img 
/myApp/sounds/ringtones/bell.mp3 

啓動應用程序的工作路徑是

<parent path>/myApp/app/ 

如果要立即訪問picture1.img你不必知道它的真實路徑(從根向下到它的實際文件夾)是。只需使用relativize()提供的相對路徑即可。它是這樣的:

Path path = Paths.get("/myApp/app/app.java"); 
Path path2 = Paths.get("/myApp/img/picture1.img"); 
System.out.println((path.relativize(path2))); 

導致

../../img/picture1.img 

這是「相對路徑」從文件app.java到您的文件picture1.img。

代表文件app.java的第一路徑符號本身

第二是它的父文件夾/應用

您現在所在的文件夾中

/myApp 

從哪裏你回到梯子後面的p ATH

/img/picture1.img 

可以使用上面顯示的相對路徑,你不必在意它的真實路徑(),它可以得到的文件,例如:

/Users/me/apps/myApp/img/picture1.img 

它只是沒有按」如果您知道自己的文件夾結構並使用相對路徑訪問您的文件,那麼您就不必打開應用程序文件夾所在的位置。

現在回到你的例子

相對化()不知道,從你的角度來看

<parent folder>/documents/Test/cat.html 

應該是一樣

/Users/somename/documents/Test/cat.html 

對於相對化()它看起來像這樣

/root/Users/somename/documents/Test/cat.html 
/root/documents/Test/cat.html 

所以,從上cat.html開始你去

1)cat.html = ../

2)測試= ../../

3)文檔= ../../../

4)somename = ../../../../

5)使用者= ../../../../。 ./

現在你已經收到d根,現在你沿着第二條路走下梯子。

所以輸出

../../../../../documents/Test/cat.html

是從相對化完全正確()的點視圖。

這個解釋有助於您更好地理解relativize()的功能嗎?

+0

這個解釋正是我所期待的。我現在完全理解它,謝謝。 – Helenesh

+0

不客氣。 :-) – DiabolicWords