即使目录中有文件,DirectoryStream也是空的

时间:2018-03-29 12:43:37

标签: java java-stream

我对enter image description here有疑问。我目前正在尝试为我的应用程序构建一个LogViewer,它应该遍历目录中的所有Files并将它们添加到Grid中。

This is the directory.

出于测试目的,它目前只包含一个文件。

这是代码:

final Path logDirPath = Paths.get(this.logDir);
    if (logDirPath.toFile().isDirectory()) {
        try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(logDirPath, "*.log")) {
            for (Path p : directoryStream) {
                logFiles.add(new LogFile(p.toFile()));
            }
        } catch (final IOException e) {
            this.logger.error("Could not read files in directory {}", this.logDir, e);
        }
    }

logDir的值为logs/activity

我试过调试它,但它只是跳过了行logFiles.add(new LogFile(p.toFile()));,所以看起来目录必须是空的,但我知道它不是。

那么,有人能发现问题吗?任何帮助将不胜感激。

修改

我通过

获得logDir
@Value("${logging.directory}")
private String logDir;
来自application.properties文件的

,看起来像

logging.directory=logs/activity
logging.file=${logging.directory}/activity.log

但是,我认为这与此无关,因为我已经尝试通过简单地硬编码logDir来替换logs/activity

2 个答案:

答案 0 :(得分:1)

您可以使用文件访问者。无论如何,这样更安全,因为在访问结束时保证释放所有资源。此外,它还提供了自定义如何迭代文件系统所需的每个入口点。

Files.walkFileTree(Paths.get("logs/activity"), new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        if (file.endsWith(".log")) {
            // Handle log file.
        }

        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
        // Handle exception
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
        // CONTINUE if you want recursive behaviour, SKIP_SUBTREE if not.
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
        return FileVisitResult.CONTINUE;
    }
});

答案 1 :(得分:0)

现在解决了:我只是没有将logFiles列表添加到网格中。

是什么让我认为DirectoryStream是空的是错误,是调试器跳过for循环。我想这就是eclipse调试器如何处理它。

之前我曾使用IntelliJ,我很确定他们的调试器不会处理它。