File.listFiles() 不适用于 Linux
File.listFiles() does not work on Linux
好的。我有以下网络应用程序片段(在构造函数中调用 - 如果这很重要):
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();
returns 空值。我从以下 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 变量的长度而引发的,该变量为 null。
我的第一个尝试是更改相关 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
!
好的。我有以下网络应用程序片段(在构造函数中调用 - 如果这很重要):
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();
returns 空值。我从以下 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 变量的长度而引发的,该变量为 null。
我的第一个尝试是更改相关 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
!