4

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

        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);

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

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

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

4

2 回答 2

5
String clipName = "Chook.wav";

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

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

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

于 2011-06-19T05:40:25.820 回答
4

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

用于定位资源的逻辑本质上是相同的getResourcegetResourceAsStream方法之间的区别在于一个返回一个 URL,另一个返回一个InputStream.


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

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

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

于 2011-06-19T05:42:19.210 回答