大家好。 這是使用NIO.2系列進行文件過濾的第2部分。 對于那些尚未閱讀第1部分的人 ,這里有個回顧。
NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API,您可以執行與java.io相同的操作,以及許多出色的功能,例如:訪問文件元數據并查看用于目錄更改等。 顯然,由于向后兼容,java.io包不會消失,但是我們鼓勵為滿足新的I / O需求而開始使用NIO.2。 在本文中,我們將看到使用此API過濾目錄內容有多么容易。 為此,有3種方法,我們已經在第1部分中回顧了一種方法,現在我們將看到另一種方法。
你需要什么
NetBeans 7+或任何其他支持Java 7的IDE
JDK 7+
在某些應用程序中,過濾目錄的內容是一項常見的任務,而NIO.2使其變得非常簡單。 接下來將描述我們將要使用的類和接口:
- java.nio.file.Path :接口,其對象可以表示文件系統中的文件或目錄。 就像java.io.File,但是在NIO.2中。 無論您要執行什么I / O操作,都需要該接口的實例。
- java.nio.file.PathMatcher :允許對象在路徑上執行匹配操作的接口。
- java.nio.file.DirectoryStream :接口,其對象遍歷目錄的內容。
- java.nio.file.Files :帶有對文件,目錄等進行操作的靜態方法的類。
我們將用來過濾目錄內容的方法是通過使用實現java.nio.file.PathMatcher接口的對象。 我們可以使用方法在java.nio.file.Files類的幫助下獲得這些對象之一
+ getPathMatcher(String):PathMatcher 。 此方法同時支持'glob'和'regex'模式。 您可以檢查使用NIO.2的文件過濾的第1部分,以獲取有關“ glob”的更多信息以及有關“ regex”的信息,請訪問java.util.regex.Pattern類。 該模式與文件,目錄等的名稱匹配。它們位于目錄內。 記住這一點很重要,使用此方法只能按文件名,目錄名等進行過濾。
例如,如果要過濾.png和.jpg圖像,則應使用以下語法和模式之一(請注意語法和模式之間的冒號):
- 'glob:*。{png,jpg}'
- 'regex:([[^ \ s] +(\。(?i)(png | jpg))$)'
當然,“ glob”語法要簡單得多,但是您可以選擇使用正則表達式進行更詳細的匹配。 無論如何,您可能想知道如果java.nio.files.DirectoryStream接口允許您直接使用'glob'進行過濾,那么為什么應該使用這種方法呢?讓我們假設您已經有了一個過濾器,但是您需要執行一種過濾操作,那就是您需要使用這種方法時。
以下代碼段定義了一種使用不同模式掃描目錄的方法:
//in a class.../*** Scans the directory using the patterns passed * as parameters. * Only 3 patterns will be used.* @param folder directory to scan* @param patterns The first pattern will be used* as the glob pattern for the DirectoryStream. */private static void scan(String folder, String... patterns) {//obtains the Images directory in the app directoryPath dir = Paths.get(folder);//the Files class offers methods for validationif (!Files.exists(dir) || !Files.isDirectory(dir)) {System.out.println('No such directory!');return;}//validate at least the glob patternif (patterns == null || patterns.length < 1) {System.out.println('Please provide at least the glob pattern.');return;}//obtain the objects that implements PathMatcherPathMatcher extraFilterOne = null;PathMatcher extraFilterTwo = null;if (patterns.length > 1 && patterns[1] != null) {extraFilterOne = FileSystems.getDefault().getPathMatcher(patterns[1]);}if (patterns.length > 2 && patterns[2] != null) {extraFilterTwo = FileSystems.getDefault().getPathMatcher(patterns[2]);}//Try with resources... so nice!try (DirectoryStreamds = Files.newDirectoryStream(dir, patterns[0])) {//iterate over the content of the directory and apply //any other extra patternint count = 0;for (Path path : ds) {System.out.println('Evaluating ' + path.getFileName());if (extraFilterOne != null && extraFilterOne.matches(path.getFileName())) {System.out.println('Match found Do something!');}if (extraFilterTwo != null && extraFilterTwo.matches(path.getFileName())) {System.out.println('Match found Do something else!');}count++;}System.out.println();System.out.printf('%d Files match the global pattern\n', count);} catch (IOException ex) {ex.printStackTrace();}}
您可以嘗試使用以下參數調用最后一個方法:
- C:\ Images或/ Images,具體取決于您的操作系統。
- ?_ *。jpg此模式指定您要使用名稱以一位開頭和下劃線開頭的所有.jpg圖像。
- glob:2_ *指定另一個過濾器(使用glob語法),在該過濾器中,您僅需要名稱以第二個數字開頭并帶有下劃線的項目。
- glob:3_ *指定另一個過濾器(使用glob語法),在該過濾器中,您只希望名稱以數字3開頭并帶有下劃線的項目。
擁有多個過濾器可讓您對匹配項采取不同的操作。
以下是在Windows計算機上執行的結果:
在我的Linux虛擬機上:
再一次,寫一次,到處運行! 但是,請注意,項目的順序取決于系統,因此請不要硬編碼文件或目錄的位置。
希望您喜歡這篇文章,還有另一種更強大的方法來過濾目錄的內容,我們將在第3部分中進行探討。 單擊此處以下載源代碼。
參考: Java 7:使用NIO.2進行文件過濾–來自Java和ME博客的JCG合作伙伴 Alexis Lopez的第2部分 。
翻譯自: https://www.javacodegeeks.com/2012/11/java-7-file-filtering-using-nio-2-part-2.html