好。 我有以下的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
是一个鲜为人知的事实!