我对DirectoryStream有个问题。目前,我尝试为我的应用程序构建一个LogViewer,它应该遍历目录中的所有文件并将它们添加到网格中。

出于测试目的,它目前只保存一个文件。
下面是守则:
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。
发布于 2018-04-03 06:36:56
这个问题现在已经解决了:我只是没有将logFiles列表添加到网格中。
是什么让我认为DirectoryStream是空的,是因为调试器跳过了for-循环。我想这正是eclipse调试器处理它的方式。
我以前使用过IntelliJ,我很确定这不是他们的调试器处理它的方式。
发布于 2018-03-29 15:52:12
你可以找个档案访问者。无论如何,这是比较安全的,因为在访问结束时,所有资源都将被释放。另外,它给出了自定义应该如何迭代文件系统所需的每个入口点。
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;
}
});https://stackoverflow.com/questions/49556418
复制相似问题