大家好。 這是使用NIO.2系列進行文件過濾的第3部分。 對于那些尚未閱讀第1 部分或第2部分的人 ,這里有個回顧。
NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API,您可以執行與java.io相同的操作,以及許多出色的功能,例如:訪問文件元數據并查看用于目錄更改等。 顯然,由于向后兼容,java.io包不會消失,但是我們鼓勵為滿足新的I / O需求而開始使用NIO.2。 在本文中,我們將看到使用此API過濾目錄內容有多么容易。 為此,有3種方法,我們已經在第1 部分和第2 部分中回顧了兩種類似的方法,但是現在我們將看到一種更強大的方法。
你需要什么
NetBeans 7+或任何其他支持Java 7的IDE
JDK 7+
在某些應用程序中,過濾目錄的內容是一項常見的任務,而NIO.2使其變得非常簡單。 接下來將描述我們將要使用的類和接口:
- java.nio.file.Path :接口,其對象可以表示文件系統中的文件或目錄。 就像java.io.File,但是在NIO.2中。 無論您要執行什么I / O操作,都需要該接口的實例。
- java.nio.file.DirectoryStream :接口,其對象遍歷目錄的內容。
- java.nio.file.DirectoryStream.filter <T> :一個嵌套接口,其對象決定是否應過濾目錄中的元素。
- java.nio.file.Files :帶有對文件,目錄等進行操作的靜態方法的類。
我們用來過濾目錄內容的方法是使用實??現java.nio.file.DirectoryStream.filter <T>接口的對象。 此接口僅聲明一個方法+ accept(T):boolean ,正如JavaDoc所說:“如果應接受目錄條目,則返回true ”。 因此,取決于您要實現此方法,并根據您要使用的任何屬性來決定是否應接受目錄條目:隱藏,大小,所有者,創建日期等。記住這一點很重要,使用此方法方法,您不再局限于僅按名稱進行過濾,可以使用任何其他屬性。
如果只需要目錄,則可以在創建過濾器時使用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;}
或者,如果只需要隱藏文件,則可以在創建過濾器時使用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;}
或者,如果您希望文件屬于特定用戶,則必須要求一個用戶,并將其與目錄條目的所有者進行比較。 要獲取目錄條目的所有者,可以使用java.nio.file.Files類及其+ getOwner(Path,LinkOption…):UserPrincipal方法(注意,并非所有的OS都支持此方法)。
要獲取文件系統上的特定用戶,請使用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();}}
我們可以通過將以下參數傳遞給main方法來執行前面的代碼(請查看本文結尾處的源代碼):
- 要掃描的目錄:C:\或/取決于您的操作系統。
- 篩選條件:隱藏
執行代碼時,我們得到以下信息:
在Windows計算機中,可以使用以下命令獲取隱藏文件:
dir / AAH注意,我們得到的結果相同:
在我的Linux虛擬機上:
使用命令
ls -ald。*我們得到類似的結果:
再一次,寫一次,到處運行!
希望您喜歡使用NIO.2系列進行文件過濾。 最后一點,我們回顧的所有過濾方法僅適用于一個目錄,如果要掃描完整的目錄樹,則必須使用
java.nio.file.SimpleFileVisitor類。 單擊此處下載此帖子的源代碼。
參考: Java 7:使用NIO.2進行文件過濾–來自Java和ME博客的JCG合作伙伴 Alexis Lopez (第3部分) 。
翻譯自: https://www.javacodegeeks.com/2012/11/java-7-file-filtering-using-nio-2-part-3.html