Java 7:使用NIO.2进行文件过滤–第2部分
大家好。 這是使用NIO.2系列進(jìn)行文件過(guò)濾的第2部分。 對(duì)于那些尚未閱讀第1部分的人 ,這里有個(gè)回顧。
NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API,您可以執(zhí)行與java.io相同的操作,以及許多出色的功能,例如:訪問(wèn)文件元數(shù)據(jù)并查看用于目錄更改等。 顯然,由于向后兼容,java.io包不會(huì)消失,但是我們鼓勵(lì)為滿足新的I / O需求而開(kāi)始使用NIO.2。 在本文中,我們將看到使用此API過(guò)濾目錄內(nèi)容有多么容易。 為此,有3種方法,我們已經(jīng)在第1部分中回顧了一種方法,現(xiàn)在我們將看到另一種方法。
你需要什么
NetBeans 7+或任何其他支持Java 7的IDE
JDK 7+
在某些應(yīng)用程序中,過(guò)濾目錄的內(nèi)容是一項(xiàng)常見(jiàn)的任務(wù),而NIO.2使其變得非常簡(jiǎn)單。 接下來(lái)將描述我們將要使用的類(lèi)和接口:
- java.nio.file.Path :接口,其對(duì)象可以表示文件系統(tǒng)中的文件或目錄。 就像java.io.File,但是在NIO.2中。 無(wú)論您要執(zhí)行什么I / O操作,都需要該接口的實(shí)例。
- java.nio.file.PathMatcher :允許對(duì)象在路徑上執(zhí)行匹配操作的接口。
- java.nio.file.DirectoryStream :接口,其對(duì)象遍歷目錄的內(nèi)容。
- java.nio.file.Files :帶有對(duì)文件,目錄等進(jìn)行操作的靜態(tài)方法的類(lèi)。
我們將用來(lái)過(guò)濾目錄內(nèi)容的方法是通過(guò)使用實(shí)現(xiàn)java.nio.file.PathMatcher接口的對(duì)象。 我們可以使用方法在java.nio.file.Files類(lèi)的幫助下獲得這些對(duì)象之一
+ getPathMatcher(String):PathMatcher 。 此方法支持'glob'和'regex'模式。 您可以檢查使用NIO.2的文件過(guò)濾的第1部分,以獲取有關(guān)“ glob”的更多信息,以及有關(guān)“ regex”的信息,請(qǐng)?jiān)L問(wèn)java.util.regex.Pattern類(lèi)。 該模式與文件,目錄等的名稱(chēng)匹配。它們位于目錄內(nèi)。 記住這一點(diǎn)很重要,使用這種方法只能按文件名,目錄名等進(jìn)行過(guò)濾。
例如,如果要過(guò)濾.png和.jpg圖像,則應(yīng)使用以下語(yǔ)法和模式之一(請(qǐng)注意語(yǔ)法和模式之間的冒號(hào)):
- 'glob:*。{png,jpg}'
- 'regex:([[^ \ s] +(\。(?i)(png | jpg))$)'
當(dāng)然,“ glob”語(yǔ)法要簡(jiǎn)單得多,但是您可以選擇使用正則表達(dá)式進(jìn)行更詳細(xì)的匹配。 無(wú)論如何,您可能想知道如果java.nio.files.DirectoryStream接口允許您直接使用'glob'進(jìn)行過(guò)濾,那么為什么應(yīng)該使用這種方法呢?讓我們假設(shè)您已經(jīng)有一個(gè)過(guò)濾器,但是您需要執(zhí)行一種過(guò)濾操作,那就是您需要使用這種方法時(shí)。
以下代碼段定義了一種使用不同模式掃描目錄的方法:
//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();}}您可以嘗試使用以下參數(shù)調(diào)用最后一個(gè)方法:
- C:\ Images或/ Images,取決于您的操作系統(tǒng)。
- ?_ *。jpg此模式指定您要使用名稱(chēng)以一位開(kāi)頭和下劃線開(kāi)頭的所有.jpg圖像。
- glob:2_ *指定另一個(gè)過(guò)濾器(使用glob語(yǔ)法),在該過(guò)濾器中,您只需要名稱(chēng)以第二個(gè)數(shù)字開(kāi)頭并帶有下劃線的項(xiàng)目。
- glob:3_ *指定另一個(gè)過(guò)濾器(使用glob語(yǔ)法),在該過(guò)濾器中,您只需要名稱(chēng)以數(shù)字3開(kāi)頭并帶有下劃線的項(xiàng)目。
擁有多個(gè)過(guò)濾器可讓您對(duì)匹配項(xiàng)采取不同的操作。
以下是在Windows計(jì)算機(jī)上執(zhí)行的結(jié)果:
在我的Linux虛擬機(jī)上:
再一次,編寫(xiě)一次,到處運(yùn)行! 但是,請(qǐng)注意,項(xiàng)目的順序取決于系統(tǒng),因此請(qǐng)不要硬編碼文件或目錄的位置。
希望您喜歡這篇文章,還有另一種更強(qiáng)大的方法來(lái)過(guò)濾目錄的內(nèi)容,我們將在第3部分中進(jìn)行探討。 單擊此處下載源代碼。
參考: Java 7:使用NIO.2進(jìn)行文件過(guò)濾–來(lái)自我們的JCG合作伙伴 Alexis Lopez在Java and ME博客上的第2部分 。
翻譯自: https://www.javacodegeeks.com/2012/11/java-7-file-filtering-using-nio-2-part-2.html
總結(jié)
以上是生活随笔為你收集整理的Java 7:使用NIO.2进行文件过滤–第2部分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓静默安装(安卓静默)
- 下一篇: vm linux安装为分布式(vm li