使用FileInputStream时发生Java UnsupportDaudioFileException

使用FileInputStream时发生Java UnsupportDaudioFileException,java,audio,byte,wav,javasound,Java,Audio,Byte,Wav,Javasound,我在尝试用Java播放声音时遇到问题;如果我使用 AudioInputStream soundIn = AudioSystem.getAudioInputStream(new File("./sound.wav")); 要获取AudioInputStream,它可以正常工作,并且文件可以正确播放。然而,如果我使用 AudioInputStream soundIn = AudioSystem.getAudioInputStream(new BufferedInputStream(new File

我在尝试用Java播放声音时遇到问题;如果我使用

AudioInputStream soundIn = AudioSystem.getAudioInputStream(new File("./sound.wav"));
要获取AudioInputStream,它可以正常工作,并且文件可以正确播放。然而,如果我使用

AudioInputStream soundIn = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream("./sound.wav")));
我明白了

javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream
我试图做的是播放我从麦克风录制的音频,我将它保存为WAV文件,保存在内存中的字节数组中,但我无法播放它。但是,如果我将其保存到文件并直接使用文件对象,它将播放。但是,如果我使用任何类型的InputStream,它都会失败,出现该异常,包括当我使用以下代码时:

AudioInputStream soundIn = AudioSystem.getAudioInputStream(new BufferedInputStream(new ByteArrayInputStream(recorder.getLastRecording())));

其中recorder.getLastRecording()返回一个字节数组。有什么想法吗?

这个错误实际上以各种形式出现过无数次

// lose the BufferedInputStream
AudioInputStream soundIn = AudioSystem.getAudioInputStream(
    new ByteArrayInputStream(recorder.getLastRecording()));
我认为,无论何时尝试使用InputStream,或使用需要InputStream作为中间步骤之一的代码,Java都会测试文件是否作为InputStream有效:它是否支持“标记”是这样的测试之一,文件是否“可重置”

请注意,错误消息表示无法从InputStream获取有效文件。这可能是因为java无法在文件上执行一个或多个命令,因此不会认为它是有效的输入流。 如果从文件位置或更好的位置(URL(imho))打开文件,则AudioSystem.getAudioInputStream不会经过测试文件是否可以作为有效InputStream的中间步骤

实际上,下面的javadef非常清楚地支持我所说的

)

请注意,如果您比较各种形式的“getAudioInputStream”,您将看到与URL和文件参数版本相比,InputStream参数版本中的文件有更多的要求

我最喜欢使用URL,因为URL可以很好地在JAR中定位文件,并且可以根据代码或类的根目录指定资源