它可以与传递给AudioSystem#getAudioFileFormat
的File
对象一起使用,但为什么它会在下面的对象InputStream
失败?任何建议?无法将InputStream对象传递给Java Sound API
import java.io.*;
import javax.sound.sampled.*;
public class Test {
public static void main(String[] args) throws Exception {
AudioSystem.getAudioFileFormat(new File(
"myaudio.wav"));
AudioSystem.getAudioFileFormat(new FileInputStream(
"myaudio.wav"));
}
}
输出:
Exception in thread "main" java.io.IOException: mark/reset not supported
at java.io.InputStream.reset(InputStream.java:330)
at com.sun.media.sound.WaveFileReader.getAudioFileFormat(WaveFileReader.java:88)
at javax.sound.sampled.AudioSystem.getAudioFileFormat(AudioSystem.java:985)
at Test.main(Test.java:10)
@EDIT
据@René Jeschke
,@Phil Freihofner
和@Andrew Thompson
,无论mark/reset
被要求作为强制性protocal的Java Sound API
与之交互的答案IO stream
,恕我直言,的类型流而不是raw
一个应该是特别是定义为要传递的参数的签名。这样做会比任意接受IO stream
,然后使用IOException
作为不利指标而缩小到更理想的结果。
这个问题已经出现了多次,并且可能会继续这样做。解释并不糟糕,但我很痛苦,因为使用BufferedInputStream的提议“解决方案”会增加不必要的工作,因为可以通过URL加载并完全避免标记/重置问题。 – 2012-04-03 22:12:32
当我研究这个问题,并对问题有了更好的理解时,我意识到这个答案中提供的信息是相当不错的,而且我非常关键地给它一个-1。我很乐意给它一个+1来抵消我的第一反应,但是我不能这样做,除非你的答案被编辑。非常抱歉! (如果您在编辑时收到通知,我不确定是否会收到通知,但如果您在此处留下备注,我会收到通知,并且会返回来纠正我的错误。) – 2012-04-04 00:56:06
我在回答中添加了一个小脚注。没关系,@PhilFreihofner ;-) – Neet 2012-04-04 10:05:08