【问题标题】:Java Resource Folder Name Versus Some Other NameJava 资源文件夹名称与其他名称
【发布时间】: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


【解决方案1】:

万一其他人遇到这种情况,我终于想通了。我需要为徽标使用字节流。

ClassLoader loader=Thread.currentThread().getContextClassLoader();
logo = new JLabel(new ImageIcon(ImageIO.read(loader.getResourceAsStream("KCBSEvents/Images/KCBSLogo.jpg"))));

它与jpg文件所在的文件夹无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多