gpt4 book ai didi

java - 从源代码动态访问 src/main/resources/

转载 作者:行者123 更新时间:2023-12-01 22:44:08 24 4
gpt4 key购买 nike

我的文件位于projectRoot/src/main/resources/levels/

enter image description here

如果我调用 Utils.getFileNamesInDirectory("src/main/resources/levels"),它就会起作用。
但项目打包时,levels目录被放置在.jarroot下。
如何在静态类中使其动态化?即src/main/resources/
这样代码将在 eclipse 中作为独立的 jar 运行。

列出目录中文件的代码..

public class Utils {
public static List<String> getFileNamesInDirectory(String directory){

List<String> results = new ArrayList<String>();

File[] files = new File(directory).listFiles(new FilenameFilter() {
public boolean accept(File dir, String filename) {
return filename.endsWith(".json");
}
});

for (File file : files) {
if (file.isFile()) {
results.add(file.getName());
}
}

Collections.sort(results);

return results;
}
}

已更新

我已转而使用 getResourceAsStream (因为 getResource 导致 IllegalArgumentException:URI 不是分层的),并且我能够列出Eclipse 内目录中的文件。

public static List<String> getFileNamesInDirectory(String directory){

List<String> results = new ArrayList<String>();
InputStream in = Utils.class.getResourceAsStream("/" + directory);
BufferedReader rdr = new BufferedReader(new InputStreamReader(in));
String line;

try {

while ((line = rdr.readLine()) != null) {
System.out.println("file: " + line);
results.add(new File(line).getName());
}

rdr.close();
} catch (IOException e1) {
e1.printStackTrace();
}

Collections.sort(results);

return results;
}

但是当我将其作为独立的 .jar 运行时,我在这一行收到以下错误: while ((line = rdr.readLine()) != null) {
为什么它不能在 Eclipse 之外工作?

Exception in thread "main" java.lang.NullPointerException
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:322)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:364)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:210)
at java.io.InputStreamReader.read(InputStreamReader.java:205)
at java.io.BufferedReader.fill(BufferedReader.java:165)
at java.io.BufferedReader.readLine(BufferedReader.java:328)
at java.io.BufferedReader.readLine(BufferedReader.java:393)
at com.app.tools.Utils.getFileNamesInDirectory(Utils.java:31)

最佳答案

您的代码在 Eclipse 中运行的原因是 Eclipse 启动 java从项目目录进行处理,我们可以假设

中提供的路径
Utils.getFileNamesInDirectory("src/main/resources/levels")

相对于当前工作目录(项目目录)。自文件系统位置 <project-directory>/src/main/resources/levels存在,可以找到它并返回给您。

src/main/resources是一个 Maven 约定,旨在保存项目编译/构建/部署时最终将出现在类路径中的资源。要从类路径检索资源,请使用 Class#getResource(String) , ClassLoader#getResource(String)和/或 ClassLoader#getSystemResource(String) .

现在,although there are ways to list resources in the classpath ,您通常不应该这样做。如果您需要某种资源,您就知道它的名称,因此可以使用上面列出的方法之一来获取它。

关于java - 从源代码动态访问 src/main/resources/,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25595224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com