轉自
開發者的天空
Path類提供了很多方法來對文件和目錄進行讀、寫和其他的操作。在看這些方法之前,我們先需要了解一些其他的概念:
Varargs實際上是Variable number of arguments的縮寫,也就是可變數目的參數。例如在下面的方法聲明中,CopyOption參數后面的省略號表明這個方法接受可變個數的參數。
Path moveTo(Path, CopyOption...)
當一個方法可以接受可變數目的參數時,你可以傳入以逗號分隔的多個參數,或者傳入一個數組。
對于上面的moveTo方法,可以這樣調用:
import static java.nio.file.StandardCopyOption.*;
Path orig =
;
Path new =
;
orig.moveTo(new, REPLACE_EXISTING, ATOMIC_MOVE);
Path的很多方法在文件系統上執行的操作都是原子操作,例如moveTo方法。原子操作是指不會被中斷或不會部分執行的操作。操作要么是完全成功,要么是完全失敗。當有多個進程操作同文件系統的相同的區域的時候這一點就很重要。
很多的文件I/O方法支持方法鏈的概念。
調用第一個方法會返回一個對象,我們可以直接調用這個對象的方法,這個方法依然返回一個對象,我們又可以直接調用該對象的方法,就這樣持續下去。例如:
String value = Charset.defaultCharset().decode(buf).toString();
UserPrincipal group = file.getFileSystem().getUserPrincipalLookupService().lookupPrincipalByName("me");
這個技術能夠使我們編寫更加緊湊的代碼,避免聲明一些我們不需要的臨時變量。
Path類實現了FileRef接口。FileRef接口包含了定位文件和訪問文件的方法。
Path類有兩個方法能夠接受帶模式匹配的參數。下面是這種參數的規則:
星號*匹配任意數目的字符(也可能是沒有)
兩個星號**同樣是代表任意數目的字符,不同的是這個匹配可以穿越目錄邊界。例如 c:"a**"bar可以匹配c:"abc"bar,也可以匹配c:"am"cn"bar。
問號?匹配一個字符
花括號{}表明子模式的集合,例如{sun,moon,stars}可以匹配'sun','moon'或‘stars’;{temp*,tmp*}可以匹配以temp或tmp開始的任意字符串。
要匹配*,?或其他的特殊字符,可以使用轉義符"。例如""匹配單個的","?匹配問號。
方括號[]表示一組單獨的字符,當使用了-的時候,也代表一個范圍的字符,例如:
[aeiou]匹配任何單獨的元音字符,[0-9]匹配任意數字,[A-Z]匹配任意大寫字母,[a-z,A-Z]匹配任意大寫或小寫字母。在方括號中,星號、問號和"都只是表示它們自身,不再作為特殊符號。
下面是一些例子:
*.html匹配所有以.html結尾的字符串。
???匹配所有長度為3的字符串
*[0-9]*匹配所有包含有數字的字符串
*.{html,htm,pdf}匹配所有以.html,.html或.pdf結尾的字符串
a?*.java匹配所有以a開頭,后面跟至少一個字符,然后以.java結尾的字符串。
{foo*,*[0-9]*}匹配以foo開頭的字符串或包含有數字的字符串。
關于參數中的模式的使用,請參考FileSystem類的getPathMatcher方法的幫助文檔。
如果這種模式匹配仍然不能夠滿足需要,我們還可以使用正則表達式。
Path會指向文件或者目錄,但是我們還不能確定這個文件或者目錄是否存在,是否可讀,是否可寫,是否可以執行。要確定文件/目錄是否存在以及程序是否可以訪問該文件/目錄,可以使用checkAccess(AccessMode...)方法。可選的AccessMode有:
* READ – 檢查文件/目錄是否存在以及程序是否有權限讀該文件/目錄
* WRITE – 檢查文件/目錄是否存在以及程序是否有權限寫該文件/目錄
* EXECUTE – 檢查文件/目錄是否存在以及程序在該文件/目錄上是否有執行權限
如果調用checkAccess的時候沒有傳入任何參數,該方法只是檢查文件是否存在。
下面的例子演示了怎樣驗證文件是否存在以及程序是否有讀和執行的權限。
import static java.nio.file.AccessMode.*;
Path file = ...;
try {
file.checkAccess(READ, EXECUTE);
} catch (IOException x) {
//Logic for error condition...
return;
}
//Logic for executable file...
需要注意的是,當checkAccess執行完之后,文件的權限可能被其他的用戶(例如系統管理員)修改。這實際上是很多應用程序都有的安全性的問題。如果你感興趣,可以搜索TOCTTOU (time of check to time of use)。
當文件系統中存在符號鏈接的時候,可能兩個不同的路徑會指向同一個文件或目錄。方法isSamePath會比較兩個Path來檢查它們是否指向同一個文件/目錄。
Path p1 = ...;
Path p2 = ...;
try {
if (p1.isSameFile(p2)) {
//Logic when the paths locate the same file
}
} catch (IOException x) {
//Logic for error condition...
return;
}