Java ClassLoader.getResourceAsStream是如何工作的?
我已经用maven创建了一个jar文件。当我打开这个罐子时,我可以找到以下内容: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
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()/<代码>的警告扩展为。