【问题标题】:File.listFiles() does not work on LinuxFile.listFiles() 在 Linux 上不起作用
【发布时间】:2015-03-11 10:43:24
【问题描述】:

好的。我有以下网络应用程序 sn-p(在构造函数中调用 - 如果这很重要):

    private File[] logFiles;
    ...
    try {
        File directory = new File(auditDirectory);
        LOG.debug("Found directory: " + directory.getAbsolutePath());
        logFiles = directory.listFiles();           
        LOG.debug("Number of logFiles: " + logFiles.length);
    } catch (Exception e) {
        LOG.error("Exception: ", e);
        throw new RuntimeException("Failed to get list of audit files", e);
    }

在我的 Windows 环境 (localhost) 中,一切都像一个魅力。在 linux (ubuntu) 环境上部署后,似乎这条线

directory.listFiles();

返回空值。我从以下 linux 部署日志中得出结论:

c.a.s.a.a.AuditFileSource - Found directory: /home/myapp/myappfolder/logs
c.a.s.a.a.AuditFileSource - Exception: 
java.lang.NullPointerException: null
    at com.myapp.services.administration.audit.AuditFileSource.<init>(AuditFileSource.java:31) ~[com.myapp.services-2.2.2.jar:2.2.2]
    at... 

日志行 AuditFileSource.java:31 实际上是一行:

LOG.debug("Number of logFiles: " + logFiles.length);

很明显,NullPointerException 是作为尝试访问为空的 logFiles 变量上的长度而引发的。

我的第一次尝试是更改相关 Linux 文件夹的权限,但它们已经具有读取权限。我完全不解。任何想法?

【问题讨论】:

  • 是目录。我可以在使用 putty 登录后知道这一点。它是目录,里面有日志文件。
  • 这和看directory.isDirectory()是否返回true不一样。
  • 我已经有执行权限... :/
  • 同样,这并不能回答问题:如果您登录directory.isDirectory(),您会看到什么?
  • 执行权限不是您阅读目录中的条目所需要的;您需要的是 read 权限。如果你stat() 文件,你将需要执行权限。

标签: java linux ubuntu web


【解决方案1】:

这是File 的众多问题之一;它的.listFiles() 方法不可靠。

尝试改用这个:

final Path dir = Paths.get("path/to/directory");

final DirectoryStream<Path> dirStream = Files.newDirectoryStream(dir);

// use the stream

如果 fs 条目不是目录,你至少会得到一个NotDirectoryException;如果你没有足够的权限,你会得到一个AccessDeniedException;等等等等。

删除File。毕竟这是2015年。新的文件 API(又名 JSR 203,又名 NIO2)自 2011 年以来一直存在!


从 Java 8 开始你也可以使用Files.list();但是请注意,您应该在 try-with-resources 块中使用它,如下所示:

try (
    final Stream<Path> stream = Files.list(thedir);
) {
    // use the stream
}

Stream(实际上是BaseStream)实现了AutoCloseable,这是一个鲜为人知的事实!

【讨论】:

  • 我会试试这个。谢谢。
  • 想知道他们是否最终会让 listFiles() 可靠地工作。我将如何使用流来查看目录是否为空?
  • @simgineer 你可以检查它的.count() 是0。至于.listFiles(),除了非常严重的错误,现在可能不会改变。
猜你喜欢
  • 2017-04-15
  • 2019-05-14
  • 2012-10-06
  • 2017-11-25
  • 2013-03-22
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多