Java 7:使用NIO.2进行文件过滤–第3部分
大家好。 這是使用NIO.2系列進(jìn)行文件過濾的第3部分。 對(duì)于那些尚未閱讀第1 部分或第2部分的人 ,這里有個(gè)回顧。
NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API,您可以執(zhí)行與java.io相同的操作,以及許多出色的功能,例如:訪問文件元數(shù)據(jù)并查看用于目錄更改等。 顯然,由于向后兼容,java.io包不會(huì)消失,但是我們鼓勵(lì)為滿足新的I / O需求而開始使用NIO.2。 在本文中,我們將看到使用此API過濾目錄內(nèi)容有多么容易。 為此,有3種方法,我們已經(jīng)在第1 部分和第2 部分中回顧了兩種類似的方法,但是現(xiàn)在我們將看到一種更強(qiáng)大的方法。
你需要什么
NetBeans 7+或任何其他支持Java 7的IDE
JDK 7+
在某些應(yīng)用程序中,過濾目錄的內(nèi)容是一項(xiàng)常見的任務(wù),而NIO.2使其變得非常簡(jiǎn)單。 接下來將描述我們將要使用的類和接口:
- java.nio.file.Path :接口,其對(duì)象可以表示文件系統(tǒng)中的文件或目錄。 就像java.io.File,但是在NIO.2中。 無論您要執(zhí)行什么I / O操作,都需要該接口的實(shí)例。
- java.nio.file.DirectoryStream :接口,其對(duì)象遍歷目錄的內(nèi)容。
- java.nio.file.DirectoryStream.filter <T> :一個(gè)嵌套接口,其對(duì)象決定是否應(yīng)過濾目錄中的元素。
- java.nio.file.Files :帶有對(duì)文件,目錄等進(jìn)行操作的靜態(tài)方法的類。
我們用來過濾目錄內(nèi)容的方法是使用實(shí)??現(xiàn)java.nio.file.DirectoryStream.filter <T>接口的對(duì)象。 此接口僅聲明一個(gè)方法+ accept(T):boolean ,正如JavaDoc所說:“如果應(yīng)接受目錄條目,則返回true ”。 因此,取決于您要實(shí)現(xiàn)此方法,并根據(jù)您要使用的任何屬性來決定是否應(yīng)接受目錄條目:隱藏,大小,所有者,創(chuàng)建日期等。記住這一點(diǎn)很重要,使用此方法方法,您不再局限于僅按名稱進(jìn)行過濾,可以使用任何其他屬性。
如果只需要目錄,則可以在創(chuàng)建過濾器時(shí)使用java.nio.file.Files類及其+ isDirectory(Path,LinkOption…):boolean方法:
//in a class.../*** Creates a filter for directories only* @return Object which implements DirectoryStream.Filter* interface and that accepts directories only.*/public static DirectoryStream.Filter<Path> getDirectoriesFilter() {DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {@Overridepublic boolean accept(Path entry) throws IOException {return Files.isDirectory(entry);}};return filter;}或者,如果只需要隱藏文件,則可以在創(chuàng)建過濾器時(shí)使用java.nio.file.Files類及其+ isHidden(Path):boolean方法:
//in a class.../*** Creates a filter for hidden files only* @return Object which implements DirectoryStream.Filter* interface and that accepts hidden files only.*/public static DirectoryStream.Filter<Path> getHiddenFilesFilter() {DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {@Overridepublic boolean accept(Path entry) throws IOException {return Files.isHidden(entry);}};return filter;}或者,如果您希望文件屬于特定用戶,則必須要求一個(gè)用戶,并將其與目錄條目的所有者進(jìn)行比較。 要獲取目錄條目的所有者,可以使用java.nio.file.Files類及其+ getOwner(Path,LinkOption…):UserPrincipal方法(注意,并非所有的OS都支持此方法)。
要獲取文件系統(tǒng)上的特定用戶,請(qǐng)使用java.nio.file.FileSystem類及其+ getUserPrincipalLookupService() :
//in a class.../*** Creates a filter for owners* @return Object which implements DirectoryStream.Filter* interface and that accepts files that belongs to the * owner passed as parameter.*/public static DirectoryStream.Filter<Path> getOwnersFilter(String ownerName) throws IOException{UserPrincipalLookupService lookup = FileSystems.getDefault().getUserPrincipalLookupService();final UserPrincipal me = lookup.lookupPrincipalByName(ownerName);DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {@Overridepublic boolean accept(Path entry) throws IOException {return Files.getOwner(entry).equals(me);}};return filter;}以下代碼段定義了一種使用以前的任何過濾器掃描目錄的方法:
//in a class.../*** Scans the directory using the filter passed as parameter.* @param folder directory to scan* @param filter Object which decides whether a * directory entry should be accepted*/private static void scan(String folder, DirectoryStream.Filter<Path> filter) {//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 the filterif (filter == null) {System.out.println('Please provide a filter.');return;}//Try with resources... so nice!try (DirectoryStream<Path> ds = Files.newDirectoryStream(dir, filter)) {//iterate over the filtered content of the directory int count = 0;for (Path path : ds) {System.out.println(path.getFileName());count++;}System.out.println();System.out.printf('%d entries were accepted\n', count);} catch (IOException ex) {ex.printStackTrace();}}我們可以通過將以下參數(shù)傳遞給main方法來執(zhí)行前面的代碼(請(qǐng)查看本文結(jié)尾處的源代碼):
- 要掃描的目錄:C:\或/取決于您的操作系統(tǒng)。
- 篩選條件:隱藏
執(zhí)行代碼時(shí),我們得到以下信息:
在Windows計(jì)算機(jī)中,可以使用以下命令獲取隱藏文件:
dir / AAH注意,我們得到的結(jié)果相同:
在我的Linux虛擬機(jī)上:
使用命令
ls -ald。*我們得到類似的結(jié)果:
再一次,寫一次,到處運(yùn)行!
希望您喜歡使用NIO.2系列進(jìn)行文件過濾。 最后一點(diǎn),我們回顧的所有過濾方法僅適用于一個(gè)目錄,如果要掃描完整的目錄樹,則必須使用
java.nio.file.SimpleFileVisitor類。 單擊此處下載此帖子的源代碼。
參考: Java 7:使用NIO.2進(jìn)行文件過濾–來自Java和ME博客的JCG合作伙伴 Alexis Lopez (第3部分) 。
翻譯自: https://www.javacodegeeks.com/2012/11/java-7-file-filtering-using-nio-2-part-3.html
總結(jié)
以上是生活随笔為你收集整理的Java 7:使用NIO.2进行文件过滤–第3部分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 历史上的女英雄有哪些(中国历史上的巾帼英
- 下一篇: 如何移除群成员微信