2013-05-14 74 views
0

從Java教程:http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html卸下裁員從路徑

下面的實施例都包括冗餘:

/home/./joe/foo 
/home/sally/../joe/foo 

的標準化的方法刪除任何冗餘元件,其中包括 任何「 「。或「目錄/ ..」發生。無論是前面的例子中 正常化:

/home/joe/foo 

在哪裏了兩個「冗餘」路徑指向,以及他們如何可以「歸一化」這樣的嗎?

+1

你不明白'.'和'..'是什麼意思? – 2013-05-14 01:35:37

+0

我只是明白,是目前的目錄和父目錄,我不明白他們是如何工作的 – 2013-05-14 01:46:53

回答

4

首先,.表示當前目錄,..表示目錄。在

/home/./joe/foo 

.分/家,因爲當前目錄是在這種背景下的「家」。作爲另一示例,這些是相同的

/foo/././././. 
/foo 

/home/sally/../joe/foo 

的/薩利/ ..是多餘的。這就像說,「進入這個目錄,然後退後一步」。它與此相同:

/home/joe/foo 
1

「路徑」這個名字比您想象的更具文字性。如果您將文件系統視爲以根目錄/爲根的樹,則每個路徑元素代表您向下走的選擇,遠離根目錄。/home/joe/foo意味着

  1. 從根開始
  2. 內的根去home
  3. 然後內homejoe
  4. 然後內joefoo

路徑/home/sally/../joe/foo意味着

  1. 從根開始
  2. 內的根去home
  3. 然後內homesally
  4. 然後回到了一個級別(..)高達home再次
  5. 然後內home去到joe
  6. 然後內joefoo

所以你可以看到兩條路徑讓你到同一個地方。

單點裝置所以由.路徑元件可以被移除「在同一個地方的逗留」。

0

你可以分割路徑wrt「/」然後處理。

String[] arr = path.split("/"); 
for(int i = 0; i < arr.length; i++){ 
    if(arr[i].equals(".")) 
     arr[i] = ""; 
    else if(arr[i].equals("..")){ 
     boolean changed = false;int j = i - 1; 
     while(arr[j].equals("")) 
      j--; 
     if(j >= 0) 
      arr[j] = ""; 
    } 
} 

這將刪除冗餘元素,然後再次組合數組。