我正在从我的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中的适当位置,并具有适当的名称。

我怎么解决这个问题?


当前回答

@Emracool……我建议你换个选择。因为你似乎要加载一个*.txt文件。最好使用FileInputStream()而不是这个烦人的getClass(). getclassloader (). getresourceasstream()或getClass(). getresourceasstream()。至少您的代码将正确执行。

其他回答

如果您正在使用IDEA,请确保将您的资源文件夹标记为“resources”,以便IDE可以正确识别该路径。

假设你有一个名为book的文件。Json在resources/中,然后使用其中的资源,你可以这样做

InputStream input = Main.class.getResourceAsStream("/book.json");

您真正需要的是文件的一个完整的绝对classPath。因此,与其猜测它,不如尝试找出ROOT,然后将文件移动到以1为基数的更好的位置。战争>文件结构…

URL test1 = getClass().getResource("/");
URL test2 = getClass().getClassLoader().getResource("/");            
URL test3 = getClass().getClassLoader().getResource("../");

logger.info(test1.getPath()); 
logger.info(test2.getPath());
logger.info(test3.getPath());

聚会迟到了。这取决于你使用的JDK版本(也许是时候查看StackOverflow“已经回答的问题”了?)JPMS会影响您能够加载(或不能加载)的资源。

将我的代码打包为模块,我必须这样做:

.getResourceAsStream .getModule .getClass Thread.currentThread()()()(“resourceName”);

然后就成功了

规则如下:

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

试一试:

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

而不是

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

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

你正在使用的ClassLoader似乎有问题。使用contextClassLoader加载类。这与它是静态方法还是非静态方法无关

.getContextClassLoader Thread.currentThread () () .getResourceAsStream……