【问题标题】:How should I use getResource() in Java?我应该如何在 Java 中使用 getResource()?
【发布时间】:2011-09-18 01:01:42
【问题描述】:

这个问题在很多地方被问到,有无数的小变化。 (例如Java - getClassLoader().getResource() driving me bonkers 等等。)我仍然无法让它工作。
这是一个代码 sn-p:

        String clipName = "Chook.wav";
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        // URL url = classLoader.getResource(clipName);
        URL url = new URL("file:///Users/chap/Documents/workspace/the1620/bin/ibm1620/" + clipName);
        ais = AudioSystem.getAudioInputStream(url);

这行得通——请注意,我已经硬编码了包含剪辑文件的目录的路径,is 在那里,并且 is 与我的 .class 文件。唉,注释掉的代码只是为 url 返回一个空值。

大多数其他帖子似乎都在处理 getResourceAsStream()。我想我应该使用 getResource()。 有影响吗?

只是不可能这么难。有什么线索吗?

【问题讨论】:

  • clipName 的值是多少?
  • 更新了原版。邮政。 ("Chook.wav")

标签: java resources locate getresource


【解决方案1】:
String clipName = "Chook.wav";

使用getResource 时,传入的字符串必须是绝对名称或相对于某个类有效。由于您使用的是ClassLoader.getResource() 而不是Class.getResource(),所以它必须是绝对路径。

没有看到您的实际文件层次结构,我只能猜测“bin”是您编译的类和资源的根,而“ibm1260”是该路径中的一个包/文件夹,而“Chook.wav”存在于其中文件夹。如果是这种情况,那么您需要使用/ibm1260/Chook.wav(或者可能是ibm1260/Chook.wav,我通常不使用类加载器进行资源查找)作为您传递给getResource() 的文件的名称。

无论哪种方式,您都需要确保将文件复制到已编译代码的位置,并且根文件夹位于类路径中。

【讨论】:

  • bin/ 是根目录(它是 Eclipse 创建的默认目录)。 bin/ibm1620/ 是包含 *.class 文件的目录,正如您猜对的那样。而 bin/ibm1620/Chook.wav 是资源。 Eclipse 将其复制到该位置。我从 SO 的其他帖子中挑选了“classloader.getResource()”爵士乐。这显然不是我应该使用的。你能为我详细说明如何使用 Class.getResource() 吗?
  • @Chap:应该没问题。您是否尝试过我使用/ibm1260/Chook.wav 的建议?结果如何?请注意,当我说“它需要是绝对路径”时,我的意思是它需要完全限定,就像 Integer.class 的完全限定路径将是 /java/lang/Integer.class
  • 进一步阅读,ibm1260/Chook.wav 似乎是您想要的绝对资源名称。
  • 是的! “ibm1620/Chook.wav”工作。所以类加载器显然需要一个到根目录进行编译输出。实际上,我更愿意将我的“资源”从我的 .class 文件中隔离到一个单独的子目录中,但是我如何告诉 Eclipse 和/或 NetBeans 这就是我想要的,这让另一个晚上很头疼。
  • @Chap:如果马克的回答解决了问题,请将其标记为“正确”。
【解决方案2】:

getResourcegetResourceAsStream 方法用于访问类路径上的资源。您似乎正在尝试访问一些不在类路径中的资源。

getResourcegetResourceAsStream 用于定位资源的逻辑基本相同。这两种方法的区别在于一个返回一个 URL,另一个返回一个InputStream


不可能这么难。有什么线索吗?

这一点都不难。您只需要了解类路径的工作原理......并确保您使用的资源名称能够解析为您在类路径上的目录或 JAR 文件之一中的正确位置放置的资源。

或者,如果资源不是您应用程序的“一部分”,请不要以这种方式访问​​它。

【讨论】:

  • 嗯,根据 Eclipse 设置,类路径是“the1620”。我的资源和类文件都在 /Users/chap/Documents/workspace/the1620/bin/ibm1620/ 中。那么,它们是否在类路径上?
  • 类路径是“the1620”。 ClassLoader 似乎在查看“the1620/bin”。我的 .class 文件和资源文件位于“the1620/bin/ibm1620”中。它可能并不“难”,但肯定会令人困惑! ;-)
  • 在这种情况下,您应该调用 getResource("/ibm1620/Chook.wav")。
  • 我不知道我们在这里讨论的是什么方法,但在下面:` ClassLoader classLoader = Thread.currentThread().getContextClassLoader();说(classLoader.toString()); URL url = classLoader.getResource(clipName); ` clipName 必须是“ibm1620/Chook.wav”而不是“/ibm1620/Chook.wav”。后者导致将 url 设置为 null。为这里可怕的格式道歉。我对 META 中已知的编辑工具发表了自己的看法。 :-)
猜你喜欢
  • 2016-03-10
  • 2010-10-10
  • 2010-09-13
  • 2011-07-21
  • 2011-05-28
  • 2016-05-27
  • 2020-08-18
  • 2014-10-15
  • 2020-07-21
相关资源
最近更新 更多