- Java核心技術·卷Ⅱ:高級特性(原書第10版)
- (美)凱S.霍斯特曼
- 1229字
- 2020-10-30 18:10:44
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)
如果在試圖獲取給定文件的信息時拋出異常,則該方法被調用。默認實現是重新拋出異常,這會導致訪問操作以這個異常而終止。如果你想自己訪問,可以覆蓋這個方法。
- The Complete Rust Programming Reference Guide
- ASP.NET Core:Cloud-ready,Enterprise Web Application Development
- 深入理解Android(卷I)
- 數據庫程序員面試筆試真題與解析
- 信息技術應用基礎
- Cocos2d-x學習筆記:完全掌握Lua API與游戲項目開發 (未來書庫)
- R Data Analysis Cookbook(Second Edition)
- Android Wear Projects
- HTML+CSS+JavaScript編程入門指南(全2冊)
- Scala編程(第5版)
- UX Design for Mobile
- Instant Automapper
- ABAQUS6.14中文版有限元分析與實例詳解
- 交互設計師成長手冊:從零開始學交互
- After Effects CC案例設計與經典插件(視頻教學版)