File.list() 在 Java 中返回 null - Springboot

File.list() returns null in Java - Springboot

提问人:PuneethC99 提问时间:7/1/2023 最后编辑:jithinkmatthewPuneethC99 更新时间:7/14/2023 访问量:67

问:

我有以下代码

File folder = new File("./src/main/resources/uploads");
LOGGER.info("Read folder - {}", folder.getName()); // prints uploads correctly
folder.setReadable(true, false);
folder.setWritable(true, false);
String[] directories = folder.list();
System.out.println(directories.length)// throws an NPE here.

我的代码在我的 Windows 机器上工作正常,但在我的 UNIX 环境中因 NPE 而失败。 我在这里做错了什么吗?

我尝试了使用和不使用以下代码

folder.setReadable(true, false);
folder.setWritable(true, false);

Uploads 绝对是我手动创建的目录。此外,它在我的本地机器上运行良好。

提前致谢。

java 文件- java-io r.java文件

评论

2赞 Andrej Istomin 7/1/2023
我建议记录而不是确保您的程序查看正确的目录。folder.getAbsolutePath()folder.getName()
0赞 DuncG 7/1/2023
和 的结果代码是什么?最有可能的是,您期望的路径不存在,并且这些调用已失败。setReadableexists()
2赞 rzwitserloot 7/1/2023
顾名思义,它是源代码,在运行时不可用。这不是您阅读资源的方式。使用 - 有很多很多关于它的教程。srcMyClass.class.getResource
1赞 MadProgrammer 7/1/2023
不要在代码中引用 src - 一旦程序打包,它就不存在了
1赞 MadProgrammer 7/1/2023
来自 JavaDocs - “如果此抽象路径名不表示目录,或者发生 I/O 错误,则返回 null。” - 请记住,这是一个抽象表示,它不表示或表示文件系统上的实际文件。File

答:

0赞 Stephen C 7/1/2023 #1

毫无疑问,问题的根本原因是显而易见的。您告诉它列出的目录不存在...在执行平台上......与该相对路径名...相对于执行应用程序的当前目录进行解析时。

有几条线索可以解释为什么会这样:

  1. Java 它不存在!javadocs 表示,如果路径名表示的对象不存在、不可读或不是目录,则返回。Files.list()null

  2. 您的路径名似乎是相对于您的项目目录指定的。当您尝试在另一台计算机上运行(例如)应用程序的 JAR 时,该项目目录将不存在。即使它在那里,您(或其他用户)在运行 JAR 之前也很可能没有“d”到该目录。cd

现在我不确定该目录的目的是什么。但是把它放在“/src/resources”树中可能是一个错误......甚至在开发平台上。download

为什么?因为“资源”树中的文件(通常)将合并到构建工具生成的 JAR(或 WAR 或其他)文件中。


您的问题中没有足够的上下文来为您提供最合适的解决方案。一种替代方法是将下载目录的位置设置为部署或运行应用程序的人员可以修改的配置参数。

此外,建议使用 和 API 而不是旧版 API。如果出现问题,前者将抛出异常,并显示信息性异常消息。例如,失败的“列表”的消息会告诉您问题是路径不正确,对象无法访问或不是目录。无需猜测。FilesPathFile

0赞 PuneethC99 7/14/2023 #2

使用 ResourceLoader 为我解决了这个问题。