file.listFiles()在Linux上不起作用 [英] File.listFiles() does not work on Linux

查看:53
本文介绍了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环境(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文件夹上的权限,但它们已经拥有读取权限。我完全迷惑了。有什么想法吗?

推荐答案

这是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年来一直存在!


从Java8开始,您也可以使用Files.list();但是请注意,您应该像这样在试用资源挡路中使用它:

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

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

这篇关于file.listFiles()在Linux上不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆