检索目录中的文件名时出现问题



我有以下方法来检索日志目录中由logback生成的日志文件的名称。前 9 行确定日志记录目录:

    private List<String> getLogFileNames() {
        List<String> logFileNames = new ArrayList<>();
        ch.qos.logback.classic.Logger rootLogger = ((ch.qos.logback.classic.Logger) LOGGER).getLoggerContext().getLogger("root");
        Path logDir;
        Appender<ILoggingEvent> appender = rootLogger.getAppender("file");
        if (appender == null) {
            logDir = Paths.get(System.getProperty("user.dir"), "../logs");
        } else {
           RollingFileAppender<?> rollingFileAppender = (RollingFileAppender<?>) appender;
           logDir = Paths.get(rollingFileAppender.getFile()).getParent();
       }
        try {
            Files.list(logDir).forEach(log -> logFileNames.add(log.toFile().getName()));
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }
        return logFileNames;
}

有时会引发以下异常: java.nio.file.FileSystemException: ... : 打开的文件太多

我怀疑异常是在 Files.list(logDir(.forEach(( 语句中抛出的。不知何故,在这一段代码中,文件被打开但从未关闭。我应该如何解决这个问题?我可以使用 foreach 语句还是应该使用类似的东西:

try(Stream<Path> stream = Files.walk(logDir)) {
    // Code to extract the filename
}
catch(UncheckedIOException ex) {
    throw ex.getCause();
}

重复:为什么使用 java.nio.files.File::list 会导致这个广度优先的文件遍历程序崩溃并出现"打开的文件太多"错误?

请考虑使用"尝试使用资源"方法。

最新更新