Java 7:使用NIO.2进行文件过滤–第3部分

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

            @Override
            public 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>() {

            @Override
            public 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>() {

            @Override
            public 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 directory
        Path dir = Paths.get(folder);
        //the Files class offers methods for validation
        if (!Files.exists(dir) || !Files.isDirectory(dir)) {
            System.out.println('No such directory!');
            return;
        }
        //validate the filter
        if (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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值