我对有疑问。我目前正在尝试为我的应用程序构建一个LogViewer,它应该遍历目录中的所有Files并将它们添加到Grid中。
出于测试目的,它目前只包含一个文件。
这是代码:
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
。
答案 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,我很确定他们的调试器不会处理它。