Java ClassLoader.getResourceAsStream是如何工作的?

Java ClassLoader.getResourceAsStream是如何工作的?,java,classloader,getresource,Java,Classloader,Getresource,我已经用maven创建了一个jar文件。当我打开这个罐子时,我可以找到以下内容: my.jar |_text1.txt |_folder |_ ... some other stuff 当我在Eclipse中运行此代码段时,“text1.txt”的内容和打印出来的文件夹内容中的所有文件名 String tmp = IOUtils.toString(App.class.getClassLoader().getResourceAsStream("text1.txt"), Sta

我已经用maven创建了一个jar文件。当我打开这个罐子时,我可以找到以下内容:

my.jar
|_text1.txt
|_folder
|_ ... some other stuff
当我在Eclipse中运行此代码段时,“text1.txt”的内容和打印出来的文件夹内容中的所有文件名

String tmp = IOUtils.toString(App.class.getClassLoader().getResourceAsStream("text1.txt"), StandardCharsets.UTF_8);
System.err.println(tmp);
            
tmp = IOUtils.toString(App.class.getClassLoader().getResourceAsStream("folder"), StandardCharsets.UTF_8);
System.err.println(tmp);
当我以独立程序的形式运行此代码时,也会打印“text1.txt”中的内容,但文件夹的第二部分返回null

我做错了什么

App.class.getClassLoader().getResourceAsStream

不要这样做。正确的方法是
App.class.getResourceAsStream
。有时
getCLassLoader()
返回null;在这种情况下,您的策略被破坏,上述方法将很好地发挥作用。此外,您的方式是更多的调用和更多的代码,但没有任何收益

IOUtils.toString(App.class.getClassLoader().getResourceAsStream(“文件夹”)

您无法获取“文件夹”。您认为这会做什么?资源加载程序系统中设计的抽象(您在这里使用的)不允许您以任何方式获取文件夹,也不允许您列出文件夹的内容。(您可能正在寻找SPI:服务提供器接口)

IOUtils

您不需要这个;
java.nio.file.Files
是内置的,并且有一个相同的toString方法。它甚至默认为
UTF-8
,因此您不必指定它

App.class.getResourceAsStream(“text1.txt”)

这将在与App.class完全相同的位置查找t1.txt。甚至是相同的包结构。如果您想从App.class所在位置的“根”开始查找(通常是
-classpath
),请在前面加一个斜杠:例如,询问
“/text1.txt”

假设您在根目录中有text1.txt,而不是在
com/foo/pkg/MyApp.class
旁边的
com/foo/pkg/MyApp.class
中,您需要指定
“/text1.txt”
来查找它

如果您不确定这些东西在哪里,请查看此调用的结果:

App.class.getResource("App.class");
这会打印出一个URL,从中你的眼球就能知道它在看什么

以及打印出来的文件夹内容中的所有文件名

String tmp = IOUtils.toString(App.class.getClassLoader().getResourceAsStream("text1.txt"), StandardCharsets.UTF_8);
System.err.println(tmp);
            
tmp = IOUtils.toString(App.class.getClassLoader().getResourceAsStream("folder"), StandardCharsets.UTF_8);
System.err.println(tmp);
那很好这不起作用-eclipse在运行时为您提供了这一功能,这是一种奇怪的想法,但该规范基本上没有对此进行抽象。类加载器实现可以做任何他们想做的事情(这是一个可插拔的系统),他们需要实现的唯一方法是“在这个位置查找资源”。如果您需要一个“文件夹”,则没有义务返回一个文件名字符串,而大多数类加载器(包括读取jar文件的类加载器)根本没有义务返回


解决方案是SPI:在编译时生成一个列出路径或类名的文件,然后在运行时使用资源系统加载该文件,然后加载其中列出的每个类/每个资源。注释处理器可以将生成此文件的过程作为编译的一部分进行自动化,从而使整个过程天衣无缝。有关详细信息,请在web上搜索SPI java。

文件夹文件是否存在?您所说的独立程序是什么意思?你能展示一下你是如何运作的吗?我认为您没有将文件夹添加到类路径。这是它的NULL的原因。请考虑将对<代码> GETCaseLoopeServer()/<代码>的警告扩展为。