【发布时间】:2017-05-31 10:03:12
【问题描述】:
与其他名称相反,名称为“资源”的文件夹有什么神奇之处吗?我在“资源”中有一个文件,当我尝试加载它时,它工作正常。
ClassLoader loader=Thread.currentThread().getContextClassLoader();
InputStream propFile=loader.getResourceAsStream("KCBSEvents/resource/build.properties");
我做了一个 prop.load(propFile) 来加载属性。
当我尝试使用类似的逻辑从名为“Images”的目录中加载图像时,它会失败。这两个目录在我的树中处于同一级别。
ClassLoader loader=Thread.currentThread().getContextClassLoader();
java.net.URL logoURL=loader.getClass().getResource("KCBSEvents/Images/KCBSLogo.jpg");
结果是“logoURL”为空。我只能得出结论,目录名称“resource”或“getResource”的工作方式与“getResourceAsStream”不同。有人可以解释发生了什么吗? TIA。
【问题讨论】:
-
好吧,获取资源作为流返回一个流,但可能相关:stackoverflow.com/questions/6608795/…
-
也许你应该把图片文件夹放在资源文件夹中?
-
你想要什么,一个 URL 还是?
-
你为什么叫
loader.getClass().getResource(...)而不是loader.getResource(...)? Afaik 第一个版本会假设您的路径是相对路径,因此取决于类加载器所在的包,我假设生成的路径classloader_package/your_path不存在。如果您查看getResourceAsStream(...)的源代码,您会看到它调用getResource(...)并在生成的url 上打开一个流,所以这两种方法应该做同样的事情——唯一的区别是您是否在类或类加载器上。 -
感谢所有回复。我可以将文件移动到资源文件夹作为测试,但最终我仍然需要了解差异的原因。我正在使用 getClass 因为不使用它也不起作用。但是,您可能正在做某事。如果我删除它,'logoURL' 不再为空。但是当我做 'logo.setIcon(new ImageIcon(logoURL));'没有任何东西显示在图像应该在的位置。
标签: java classloader getresource