我正在从我的Java项目的编译JAR中的包中加载一个文本文件。相关目录结构如下:

/src/initialization/Lifepaths.txt

我的代码通过调用Class::getResourceAsStream来返回一个InputStream来加载一个文件。

public class Lifepaths {
    public static void execute() {
        System.out.println(Lifepaths.class.getClass().
            getResourceAsStream("/initialization/Lifepaths.txt"));
    }

    private Lifepaths() {}

    //This is temporary; will eventually be called from outside
    public static void main(String[] args) {execute();}
}

不管我用什么,输出总是输出null。我不知道为什么上面的方法不管用,所以我也尝试了一下:

“初始化/ src / / Lifepaths.txt” “初始化/ Lifepaths.txt” “Lifepaths.txt”

这两种方法都不起作用。到目前为止,我已经阅读了许多关于这个主题的问题,但没有一个是有帮助的——通常,他们只是说使用根路径加载文件,而我已经这样做了。或者只是从当前目录加载文件(只是加载文件名),我也尝试过。该文件将被编译到JAR中的适当位置,并具有适当的名称。

我怎么解决这个问题?


当前回答

你可能想尝试这个来获得流,即首先获得url,然后将其作为流打开。

URL url = getClass().getResource("/initialization/Lifepaths.txt"); 
InputStream strm = url.openStream(); 

我曾经有一个类似的问题:从jar读取txt文件失败,但读取图像工作

其他回答

规则如下:

检查您想要在JAR中加载的文件的位置(因此也要确保它确实添加到了JAR中) 使用绝对路径:路径从JAR的根开始 使用相对路径:路径开始于你调用getResource/ getResoucreAsStream类的包目录

试一试:

Lifepaths.class.getResourceAsStream("/initialization/Lifepaths.txt")

而不是

Lifepaths.class.getClass().getResourceAsStream("/initialization/Lifepaths.txt")

(不确定是否有区别,但前者将使用正确的ClassLoader/ JAR,而我不确定后者)

不知道是否有帮助,但在我的情况下,我的资源在/src/文件夹,并得到这个错误。 然后我将图片移动到bin文件夹,它修复了这个问题。

我知道这里有不同的答案。我的工作是这样的。 资源目录下新增文件。 在可执行代码中,我提到了该文件的路径,在文件名的引号中以“/”作为前缀。

 InputStream resourceStream = loader.getResourceAsStream("/LifePaths.txt");

我的调用者类在src/main/…

什么帮助我从src/test/resources/folder/file.properties加载资源

`properties.load(getClass().getClassLoader().getResourceAsStream("folder/file.properties"));`

https://howtodoinjava.com/java/io/read-file-from-resources-folder/

Java 11

默认的JVM类加载器将首先使用父类加载器加载资源: .

lifepathways .class. getclass()的类加载器是引导类加载器,所以getResourceAsStream只搜索$JAVA_HOME,而不管用户提供的类路径是什么。显然,Lifepaths.txt不在那里。

Lifepaths.class的类加载器是系统类路径类加载器,所以getResourceAsStream将搜索用户定义的类路径,Lifepaths.txt在那里。

当使用java.lang.Class#getResourceAsStream(字符串名称)时,不以'/'开头的名称将作为包名的前缀添加。要避免这种情况,请使用java.lang。类加载器# getResourceAsStream代替。

例如:

ClassLoader loader = Thread.currentThread().getContextClassLoader();
String resourceName = "Lifepaths.txt";
InputStream resourceStream = loader.getResourceAsStream(resourceName);