大家好。 这是使用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