java - NIO 递归列出最后修改的文件

标签 java search nio

我使用下面的代码来列出根文件夹中的所有文件。 (我的根目录包含许多文件夹和子文件夹。)

  Path startPath = Paths.get("D:\\users\\Desktop\\myRootDir");
  Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir,
                    BasicFileAttributes attrs) {
                return FileVisitResult.CONTINUE;
            }
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                 System.out.println(file);
                return FileVisitResult.CONTINUE;
            }
            @Override
            public FileVisitResult visitFileFailed(Path file, IOException e) {
                return FileVisitResult.CONTINUE;
            }
        });

有没有办法只列出最后修改的文件,并且有没有办法在 java NIO 中搜索文件的内容?

注意:最后修改的文件是指最近在一个文件夹中创建的文件。

更新

           @Override
            public FileVisitResult preVisitDirectory(Path dir,
                    BasicFileAttributes attrs) {
                System.out.println(dir.getFileName());
                if(dir.getFileName().equals("processes"))
                    return FileVisitResult.SKIP_SUBTREE;
                else
                return FileVisitResult.CONTINUE;
            }
        @Override
        public FileVisitResult postVisitDirectory(Path dir, IOException e) {
            FileInfo mostRecentFile = mostRecentFilesByDir.remove(dir);
            if (mostRecentFile != null) {
              //  System.out.println(mostRecentFile.path);
            }

            return FileVisitResult.CONTINUE;
        }

上面的代码仍然从进程目录返回文件,我在这里做错了吗?

最佳答案

如果我正确理解你的问题,你想要每个目录中最近创建的包含特定文本的文件。您可以通过在映射中跟踪每个目录的最新文件并将每个文件传递给扫描程序来完成此操作:

String textToSearchFor = "important";
final Pattern searchPattern =
    Pattern.compile(Pattern.quote(textToSearchFor));

Path startPath = Paths.get("D:\\users\\Desktop\\myRootDir");
Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {

    class FileInfo {
        final FileTime time;
        final Path path;

        FileInfo(Path path, FileTime time) {
            this.path = path;
            this.time = time;
        }
    }

    private final Map<Path, FileInfo> mostRecentFilesByDir =
        new HashMap<>();

    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException e) {

        FileInfo mostRecentFile = mostRecentFilesByDir.remove(dir);
        if (mostRecentFile != null) {
            System.out.println(mostRecentFile.path);
        }

        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path file,
                                     BasicFileAttributes attrs)
    throws IOException {

        try (Scanner scanner = new Scanner(file)) {
            if (scanner.findWithinHorizon(searchPattern, 0) == null) {
                // Text not found.
                return FileVisitResult.CONTINUE;
            }
        }

        FileTime time = attrs.creationTime();
        Path dir = file.getParent();
        FileInfo info = mostRecentFilesByDir.get(dir);
        if (info == null || time.compareTo(info.time) > 0) {
            mostRecentFilesByDir.put(dir, new FileInfo(file, time));
        }

        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException e) {
        return FileVisitResult.CONTINUE;
    }
});

关于java - NIO 递归列出最后修改的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27934974/

相关文章:

尝试分配大于 256 MB 的缓冲区大小时出现 Java 段错误

java - Netty Nio 在 Java 中读取来自 ChannelFuture 的即将到来的消息

Java NIO - 使用选择器

java - 无法通过互联网访问本地托管的项目?

Java 进程卡在 SIGTERM 处理程序中删除文件

java - 是否可以搜索数组并返回值的索引

php - Mysql查询LIKE搜索并使用带符号的字符串

java - 移动应用程序中什么最重要?内存优化或快速执行

java - 在基于 java 的配置中设置 Bean 属性,无需构造函数或 setter

algorithm - 最快的搜索算法