官术网_书友最值得收藏!

2.5.7 使用目錄流

正如在前一節中所看到的,Files.walk方法會產生一個可以遍歷目錄中所有子孫的Stream<Path>對象。有時,你需要對遍歷過程進行更加細粒度的控制。在這種情況下,應該使用File.newDirectoryStream對象,它會產生一個DirectoryStream。注意,它不是java.util.stream.Stream的子接口,而是專門用于目錄遍歷的接口。它是Iterable的子接口,因此你可以在增強的for循環中使用目錄流。下面是其使用模式:

try語句塊用來確保目錄流可以被正確關閉。訪問目錄中的項并沒有具體的順序。

可以用glob模式來過濾文件:

表2-4展示了所有的glob模式。

表2-4 Glob模式

警告:如果使用Windows的glob語法,則必須對反斜杠轉義兩次:一次為glob語法轉義,一次為Java字符串轉義:Files.newDirectoryStream(dir,“C:\\\\”)

如果想要訪問某個目錄的所有子孫成員,可以轉而調用walkFileTree方法,并向其傳遞一個FileVisitor類型的對象,這個對象會得到下列通知:

·在遇到一個文件或目錄時:FileVisitResult visitFile(T path,BasicFileAttributes attrs)

·在一個目錄被處理前:FileVisitResult preVisitDirectory(T dir,IOException ex)

·在一個目錄被處理后:FileVisitResult postVisitDirectory(T dir,IOException ex)

·在試圖訪問文件或目錄時發生錯誤,例如沒有權限打開目錄:FileVisitResult visitFileFailed(path,IOException)

對于上述每種情況,都可以指定是否希望執行下面的操作:

·繼續訪問下一個文件:FileVisitResult.CONTINUE

·繼續訪問,但是不再訪問這個目錄下的任何項了:FileVisitResult.SKIP_SUBTREE

·繼續訪問,但是不再訪問這個文件的兄弟文(和該文件在同一個目錄下的文件)了:FileVisitResult.SKIP_SIBLINGS

·終止訪問:FileVisitResult.TERMINATE

當有任何方法拋出異常時,就會終止訪問,而這個異常會從walkFileTree方法中拋出。

注意:FileVisitor接口是泛化類型,但是你也太可能會使用除FileVisitor<Path>之外的東西。walkFileTree方法可以接受FileVisitor<?Super Path>類型的參數,但是Path并沒有多少超類型。

便捷類SimpleFileVisitor實現了FileVisitor接口,但是其除visitFileFailed方法之外的所有方法并不做任何處理而是直接繼續訪問,而visitFileFailed方法會拋出由失敗導致的異常,并進而終止訪問。

例如,下面的代碼展示了如何打印出給定目錄下的所有子目錄:

值得注意的是,我們需要覆蓋postVisitDirectory方法和visitFileFailed方法,否則,訪問會在遇到不允許打開的目錄或不允許訪問的文件時立即失敗。

還應該注意的是,路徑的眾多屬性是作為preVisitDirectory和visitFile方法的參數傳遞的。訪問者不得不通過操作系統調用來獲得這些屬性,因為它需要區分文件和目錄。因此,你就不需要再次執行系統調用了。

如果你需要在進入或離開一個目錄時執行某些操作,那么FileVisitor接口的其他方法就顯得非常有用了。例如,在刪除目錄樹時,需要在移除當前目錄的所有文件之后,才能移除該目錄。下面是刪除目錄樹的完整代碼:

java.nio.File.Files7

·static DirectoryStream<Path>newDirectoryStream(Path path)

·static DirectoryStream<Path>newDirectoryStream(Path path,String glob)

獲取給定目錄中可以遍歷所有文件和目錄的迭代器。第二個方法只接受那些與給定的glob模式匹配的項。

·static Path walkFileTree(Path start,FileVisitor<?super Path>visitor)

遍歷給定路徑的所有子孫,并將訪問器應用于這些子孫之上。

java.nio.file.SimpleFileVisitor<T>7

·static FileVisitResult visitFile(T path,BasicFileAttributes attrs)

在訪問文件或目錄時被調用,返回CONTINUE、SKIP_SUBTREE、SKIP_SIBLINGS和TERMINATE之一,默認實現是不做任何操作而繼續訪問。

·static FileVisitResult preVisitDirectory(T dir,BasicFileAttributes attrs)

·static FileVisitResult postVisitDirectory(T dir,BasicFileAttributes attrs)

在訪問目錄之前和之后被調用,默認實現是不做任何操作而繼續訪問。

·static FileVisitResult visitFileFailed(T path,IOException exc)

如果在試圖獲取給定文件的信息時拋出異常,則該方法被調用。默認實現是重新拋出異常,這會導致訪問操作以這個異常而終止。如果你想自己訪問,可以覆蓋這個方法。

主站蜘蛛池模板: 黔西| 明溪县| 榕江县| 济阳县| 双鸭山市| 渝北区| 东台市| 进贤县| 邹城市| 东台市| 庆安县| 青州市| 钦州市| 晋宁县| 那坡县| 彭泽县| 杭锦后旗| 清水县| 类乌齐县| 白河县| 汝阳县| 信丰县| 崇礼县| 石屏县| 龙山县| 宁安市| 阿勒泰市| 石城县| 定边县| 哈尔滨市| 中山市| 四子王旗| 喜德县| 新民市| 治县。| 内江市| 大连市| 通榆县| 朔州市| 内乡县| 千阳县|