File.listFiles()在Linux上不起作用

好。 我有以下的Web应用程序片段(在构造函数中调用 – 如果这是重要的):

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环境(本地主机),一切都像一个魅力。 在linux(ubuntu)环境下部署后,似乎是行

 directory.listFiles(); 

返回空值。 我已经得出结论,从以下的Linux部署日志:

 casaaAuditFileSource - Found directory: /home/myapp/myappfolder/logs casaaAuditFileSource - 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被引发为尝试访问logFilesvariables为null的variables。

我第一次尝试是改变相关的Linux文件夹的权限,但他们已经有读取权限。 我完全困惑。 任何想法?

这是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是一个鲜为人知的事实!