Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么getResourceAsStream()不能在JAR文件中工作?_Java_Audio_Jar_Inputstream_Getresource - Fatal编程技术网

Java 为什么getResourceAsStream()不能在JAR文件中工作?

Java 为什么getResourceAsStream()不能在JAR文件中工作?,java,audio,jar,inputstream,getresource,Java,Audio,Jar,Inputstream,Getresource,我在静态方法中有以下代码: clips.open(AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("folder/sound.wav"))); 另外,文件夹与Sound.java位于同一目录中。当我在Eclipse中运行程序时,会播放声音。但是,当我将文件导出到JAR文件时,声音不再播放 如果我将getResourceAsStream()更改为getResource(),Eclipse和JAR文件都会播放声音。为什

我在静态方法中有以下代码:

clips.open(AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("folder/sound.wav")));
另外,
文件夹
Sound.java
位于同一目录中。当我在Eclipse中运行程序时,会播放声音。但是,当我将文件导出到JAR文件时,声音不再播放


如果我将
getResourceAsStream()
更改为
getResource()
,Eclipse和JAR文件都会播放声音。为什么会发生这种情况?我读过很多书,很多人认为
getResourceAsStream()
在JAR文件中根本不起作用。是这样吗?如果是,为什么不呢?

我怀疑问题在于Class.getResourceAsStream(String)返回InputStream,Class.getResource(String)返回URL。因此,在第一种情况下,我们实际上使用

AudioSystem.getAudioInputStream(InputStream inputStream) 
在第二种情况下,使用

AudioSystem.getAudioInputStream(URL url).
为什么这很重要?我认为主要的问题是,当InputStream是参数时,会对音频文件进行标记/重置测试,结果失败。当URL用作参数时,不会进行此测试。您可以查看AudioSystem.getAudioInputStream的API以确认我在这里报告的内容


getResourceAsStream失败时是否会收到错误消息?它是否偶然提到标记/重置测试错误?如果您收到不同的错误消息,那么这可能不是正确的答案,而且还发生了其他问题。

我怀疑您的
getResource
在JAR情况下是否有任何不同。不。使用getResource(),JAR文件可以正确播放声音。其他人似乎也注意到了这一点,比如和。有趣的链接。我注意到,在这些线程上,它们没有建立一个线程有效而另一个线程无效的真正原因。我怀疑它是否涉及使用InputStream(根据我的回答)。但是,宣告生命太短也是有道理的,如果你有一些有用的东西,那就继续前进吧!无标记/重置错误。但是,在打印堆栈跟踪时,会出现一些
FileNotFoundException
s。然而,这是意料之中的。我的程序的工作方式是,用户选择一个包含文件的文件夹,然后将这些文件加载到程序中。因此,有时用户可能没有特定的文件(这不是必需的),这应该不是问题。另外,对于
getResource()
getresourceastream()
,我都会得到
FileNotFoundException
,所以这不应该是声音不能播放的原因
getresourceastream()
.1)您能为失败的实例隔离错误消息吗?换句话说,尝试加载一个已知存在且不应引发“未找到”的文件,并在使用getResourceAsStream而不是GetResource时发生错误?2) 我曾经遇到过这样一种情况,InputStream阶段失败(由于标记/重置),但调用方法getAudioInputStream()对此失败作出反应,将其报告为“未找到文件”,而不是传递较低级别的错误。你刚才给我的信息并不能完全排除这种可能性,尽管真正的原因仍然是个谜。