【问题标题】:Problem retrieving filenames in a directory检索目录中的文件名时出现问题
【发布时间】:2019-11-24 14:59:36
【问题描述】:

我有以下方法来检索 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 file filesystemexception


【解决方案1】:

【讨论】:

  • 谢谢。在我发布这个问题之前,我研究了“重复”。只是为了确定:我是否可以得出结论,我不能使用 forEach 方法,并且我总是应该使用 try with resources 方法,因为文件正在打开并将在隐含的 finally 块中关闭?
  • @MarkSmith 当然你可以使用forEach()。也只需使用 try-with-resources 即可。像这样:try (Stream&lt;Path&gt; stream = Files.list(logDir)) { stream.forEach(/*node here*/); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多