nio2和nio2_列出和过滤NIO.2中的目录内容
nio2和nio2
在Java 7發行之前,列出目錄內容的領域并沒有發生太多事情。但是,由于NIO.2引入了一種新的方法來做到這一點,因此覆蓋這一領域可能是值得的。 NIO.2的一大優點是能夠在一個方法調用中立即使用列表和過濾。 這為與文件系統相關的大多數列表/篩選需求提供了一種優雅的解決方案。
列出根目錄
除非我們使用相對路徑,否則我們需要了解應用程序所處的環境,因此我們可以定義絕對路徑。 由于文件系統通常是分層結構,因此至少有一個根目錄。 為了正確處理文件和目錄,我們需要能夠列出所有這些根目錄。 為此,我們轉向FileSystem實例本身以使用其方法getRootDirectories ,它是Java 6構造File.listRoots()的替代方法。
Iterable<Path> it = FileSystems.getDefault().getRootDirectories();System.out.println("Root file system locations: " + Sets.newHashSet(it));*請注意, Sets類不是JDK的一部分,而是來自Google的Guava庫。 我在這里使用它只是為了方便獲得根目錄的格式正確的字符串表示形式。
具有以下輸出:
Root file system locations: C:\, D:\, E:\, F:\, G:\, H:\, I:\,列出和過濾目錄內容
使用文件系統時,標準任務是列出或過濾給定目錄中的文件。 我們可能需要修改,分析或簡單列出它們-不管什么原因,類java.nio.file.Files都有我們的支持。 它提供了newDirectoryStream方法的三種變體,它們返回DirectoryStream<Path>類型的對象,以允許我們遍歷目錄中的條目。 在這里,我們看到了防止NullPointerException的IO庫的當前版本與先前版本(返回簡單數組)之間的明顯差異。 以下示例說明了列出給定目錄內容的簡單程度:
Path directoryPath = Paths.get("C:", "Program Files/Java/jdk1.7.0_40/src/java/nio/file");if (Files.isDirectory(directoryPath)) {try (DirectoryStream<Path> stream = Files.newDirectoryStream(directoryPath)) {for (Path path : stream) {System.out.println(path);}} catch (IOException e) {throw new RuntimeException(e);} }請注意,使用isDirectory檢查方法可防止NotDirectoryException 。 還要注意try-with-resources構造的使用– DirectoryStream是AutoCloseable和Closeable (這意味著它需要在某個時間關閉),因此try-with-resources派上了用場。 代碼返回以下輸出:
... C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\CopyOption.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\DirectoryIteratorException.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\DirectoryNotEmptyException.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\DirectoryStream.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileAlreadyExistsException.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\Files.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileStore.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystem.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemAlreadyExistsException.java ...為了確保DirectoryStream<Path>通用可用性,我們可以使用兩種基本機制進行過濾:
- newDirectoryStream(Path dir, String glob)
- 使用GLOB過濾
- newDirectoryStream (Path dir, DirectoryStream.Filterfilter)
- 使用DirectoryStream.Filter過濾
使用GLOB模式過濾
首先,我們需要知道GLOB是什么。 GLOB模式是遵循特定語法規則的字符串表達式,它們用于匹配目的。 請參閱以下文章,以獲取有關GLOB和GLOB語法的更多信息。 在使用GLOB進行過濾時, Files類為我們提供了一種簡便的方法。 讓我們看下面的例子。
Path directoryPath = Paths.get("C:", "Program Files/Java/jdk1.7.0_40/src/java/nio/file");if (Files.isDirectory(directoryPath)) {try (DirectoryStream<Path> stream = Files.newDirectoryStream(directoryPath, "File*Exception*")) {for (Path path : stream) {System.out.println(path);}} catch (IOException e) {throw new RuntimeException(e);} }具有以下輸出:
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileAlreadyExistsException.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemAlreadyExistsException.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemException.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemLoopException.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemNotFoundException.java使用DirectoryStream.Filter進行過濾
當手頭的任務需要更復雜的過濾選項而不僅僅是簡單的文件名匹配時,我們需要實現DirectoryStream.Filter<Path>接口。 這是我們可以使用的最強大的篩選選項,因為我們可以訪問應用程序的其余部分,并且可能使用第三方庫。 下面的示例使用兩種過濾條件顯示了這種情況:
- 文件大小必須為偶數
- 執行時間(以毫秒為單位)必須為偶數
具有以下輸出:
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\DirectoryStream.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileAlreadyExistsException.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\Files.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\NotDirectoryException.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\NotLinkException.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\package-info.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\WatchEvent.java C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\WatchService.java*請注意,根據使用條件,每次執行過濾后的文件可能會有所不同。
翻譯自: https://www.javacodegeeks.com/2014/06/listing-and-filtering-directory-contents-in-nio-2.html
nio2和nio2
總結
以上是生活随笔為你收集整理的nio2和nio2_列出和过滤NIO.2中的目录内容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带有Spring Boot和Spring
- 下一篇: 在ADF 12.2.1.3中使用基于JS