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