2013-05-14 42 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] = ""; 
    } 
} 

这将删除冗余元素,然后再次组合数组。