首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于特定日期/时间列出文件的DirectoryStream.Filter示例

基于特定日期/时间列出文件的DirectoryStream.Filter示例
EN

Stack Overflow用户
提问于 2014-02-12 16:13:38
回答 2查看 13.9K关注 0票数 3

我试图研究一个DirecoryStream.Filter newDirectoryStream示例,在这个示例中,我可以将一个目录(及其所有子目录)下的所有文件作为示例列出60天以上的文件。

代码语言:javascript
复制
DirectoryStream<Path> dirS = Files.newDirectoryStream(Paths.get("C:/myRootDirectory"), <DirectoryStream.filter>);

for (Path entry: dirS) {
    System.out.println(entry.toString());
}

在上面的代码中,DirectoryStream.filter应该是什么?

这将是一个很大的帮助,因为我是在一个项目中,我试图删除的文件,比某个时间戳和前Java1.7 File.listFiles()刚刚挂起。

Files.walkFileTree()能提供一个选项吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-12 18:56:39

如果我说得对,你有两种情况:

  1. 创建自定义filter以选择60天以上的文件
  2. 遍历子目录(整个FileTree)并收集您的信息

在使用Calendar类实现60天的条件下,自定义过滤器更容易实现:

代码语言:javascript
复制
DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
    @Override
    public boolean accept(Path entry) throws IOException {BasicFileAttributes attr = Files.readAttributes(entry,BasicFileAttributes.class);
    FileTime creationTime = attr.creationTime();
    Calendar cal = Calendar.getInstance();
    int days = cal.fieldDifference(new Date(creationTime.toMillis()),Calendar.DAY_OF_YEAR);
        return (Math.abs(days) > 60);
        }
  };

正常执行只会查找根目录中的文件。要查找子目录,您使用walkFileTree()的猜测是正确的。

然而,这需要FileVisitor接口的实现,幸运的是,它的简单实现与7- SimpleFileVisitor捆绑在一起。

要遍历子目录,可以选择覆盖特定于目录的方法--我在这里使用了preVisitDirectory of SimpleFileVisitor

代码语言:javascript
复制
Files.walkFileTree(dirs, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path file,
                    BasicFileAttributes attrs) {

由于preVisitDirectory将自定义为return FileVisitResult.CONTINUE;,以防您没有任何附加限制,因此在应用筛选器时,我们将利用preVisitDirectory方法一次迭代目录1。

代码语言:javascript
复制
Files.walkFileTree(dirs, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path file,
                    BasicFileAttributes attrs) {

                DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
                    @Override
                    public boolean accept(Path entry) throws IOException {
                        BasicFileAttributes attr = Files.readAttributes(entry,
                                BasicFileAttributes.class);
                        FileTime creationTime = attr.creationTime();
                        Calendar cal = Calendar.getInstance();
                        int days = cal.fieldDifference(
                                new Date(creationTime.toMillis()),
                                Calendar.DAY_OF_YEAR);
                        return (Math.abs(days) > 60);
                    }
                };
                try (DirectoryStream<Path> stream = Files.newDirectoryStream(
                        file, filter)) {
                    for (Path path : stream) {
                        System.out.println(path.toString());
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                return FileVisitResult.CONTINUE;

            }
        }); 

这将为所需的筛选条件提供来自整个目录和子目录结构的文件,在下面完成main方法:

代码语言:javascript
复制
public static void main(String[] args) throws IOException {
        Path dirs = Paths.get("C:/");

        Files.walkFileTree(dirs, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path file,
                    BasicFileAttributes attrs) {

                DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
                    @Override
                    public boolean accept(Path entry) throws IOException {
                        BasicFileAttributes attr = Files.readAttributes(entry,
                                BasicFileAttributes.class);
                        FileTime creationTime = attr.creationTime();
                        Calendar cal = Calendar.getInstance();
                        int days = cal.fieldDifference(
                                new Date(creationTime.toMillis()),
                                Calendar.DAY_OF_YEAR);
                        return (Math.abs(days) > 60);
                    }
                };
                try (DirectoryStream<Path> stream = Files.newDirectoryStream(
                        file, filter)) {
                    for (Path path : stream) {
                        System.out.println(path.toString());
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                return FileVisitResult.CONTINUE;

            }
        });

    }
票数 8
EN

Stack Overflow用户

发布于 2014-02-12 18:27:22

只需创建一个新的DirectoryStream.Filter实例,如果给定的Path对象超过60天,该实例将返回Path

代码语言:javascript
复制
DirectoryStream<Path> dirStream = Files.newDirectoryStream(Paths.get("/some/path"), new Filter<Path>() {
    @Override
    public boolean accept(Path entry) throws IOException {
        FileTime fileTime = Files.getLastModifiedTime(entry);
        long millis = fileTime.to(TimeUnit.MILLISECONDS);
        Calendar today = Calendar.getInstance();
        // L is necessary for the result to correctly be calculated as a long 
        return today.getTimeInMillis() > millis + (60L * 24 * 60 * 60 * 1000);
    }
});

请注意,这只会给出指定目录Path根目录中的文件,即。Path参数传递给newDirectoryStream(..)

如果您也想要子目录中的所有文件,那么Files.walkFileTree(..)可能更容易使用。您只需实现一个FileVisitor,它使用与上面的Filter相同的逻辑存储您收集的Path对象的ListSet

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21733390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档