java.io.IOException:不支持标记/重置


68
try {
    //String location = dir1.getCanonicalPath()+"\\app_yamb_test1\\mySound.au";
    //displayMessage(location);
    AudioInputStream audio2 = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("mySound.au"));
    Clip clip2 = AudioSystem.getClip();
    clip2.open(audio2);
    clip2.start();
} catch (UnsupportedAudioFileException uae) {
    System.out.println(uae);
    JOptionPane.showMessageDialog(null, uae.toString());
} catch (IOException ioe) {
    System.out.println("Couldn't find it");
    JOptionPane.showMessageDialog(null, ioe.toString());
} catch (LineUnavailableException lua) {
    System.out.println(lua);
    JOptionPane.showMessageDialog(null, lua.toString());
}

当我从netbeans运行应用程序时,此代码可以正常工作。声音播放,也没有例外。但是,当我从dist文件夹运行它时,声音不播放,并且java.io.IOException: mark/reset not supported在消息对话框中显示。

我怎样才能解决这个问题?

Answers:


143

文档AudioSystem.getAudioInputStream(InputStream)说明:

此方法的实现可能需要多个解析器来检查流,以确定它们是否支持该流。这些解析器必须能够标记流,读取足够的数据以确定它们是否支持该流,如果不能,则将流的读取指针重置为其原始位置。如果输入流不支持这些操作,则此方法可能会失败,并出现IOException。

因此,您为此方法提供的流必须支持可选的标记/重置功能。使用来装饰您的资源流BufferedInputStream

//read audio data from whatever source (file/classloader/etc.)
InputStream audioSrc = getClass().getResourceAsStream("mySound.au");
//add buffer for mark/reset support
InputStream bufferedIn = new BufferedInputStream(audioSrc);
AudioInputStream audioStream = AudioSystem.getAudioInputStream(bufferedIn);

3
是的,这可行。我修改了这样的代码: BufferedInputStream myStream = new BufferedInputStream(getClass().getResourceAsStream("mySound.au")); AudioInputStream audio2 = AudioSystem.getAudioInputStream(myStream); 现在可以正常工作=)PS,如果有人可以格式化此注释,那就太好了= /
Crais

那是标记/复位所代表的意思吗?可以寻找的溪流?@McDowell,您能否在答案中显示修饰的代码?
Ehtesh Choudhury 2011年

@Shurane-标记/重置允许流在重置被调用时将“未读”数据流回到标记点(通常是从标记被调用时开始在RAM中缓冲数据。)
McDowell

3
无法对此进行足够的投票。无法弄清楚为什么我的音频无法从文件正确加载。由于我是从文件加载的,因此对我来说这样做更容易:FileInputStream fs = new FileInputStream(filename); BufferedInputStream myStream =新的BufferedInputStream(fs); AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(myStream);
AndyG

嘿@SauceMaster我使用了这种方法,因为我也在尝试打开一个文件,但仍然无法编译。我得到:“ java.io.IOException:流关闭”。当它面对320kbps的比特率时似乎表现出这种方式,而在112中则可以正常工作。
Potney Switters,2012年

5

在挣扎了一段时间并多次参考此页面后,我偶然发现了这一点,这对解决我的问题很有帮助。我最初能够加载wav文件,但随后只能播放一次,因为由于“不支持标记/重置”错误而无法倒带该文件。这太疯狂了。

链接的代码从文件中读取AudioInputStream,然后将AudioInputStream放入BufferedInputStream,然后将放回AudioInputStream,如下所示:

audioInputStream = AudioSystem.getAudioInputStream(new File(filename));
BufferedInputStream bufferedInputStream = new BufferedInputStream(audioInputStream);
audioInputStream = new AudioInputStream(bufferedInputStream, audioInputStream.getFormat(), audioInputStream.getFrameLength());

最后,它将读取的数据转换为PCM编码:

audioInputStream = convertToPCM(audioInputStream);

将convertToPCM定义为:

private static AudioInputStream convertToPCM(AudioInputStream audioInputStream)
    {
        AudioFormat m_format = audioInputStream.getFormat();

        if ((m_format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) &&
            (m_format.getEncoding() != AudioFormat.Encoding.PCM_UNSIGNED))
        {
            AudioFormat targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                m_format.getSampleRate(), 16,
                m_format.getChannels(), m_format.getChannels() * 2,
                m_format.getSampleRate(), m_format.isBigEndian());
            audioInputStream = AudioSystem.getAudioInputStream(targetFormat, audioInputStream);
    }

    return audioInputStream;
}

我相信他们这样做是因为BufferedInputStream处理标记/重置的方法比audioInputStream好。希望这可以帮助某人。


这里的其他解决方案无法解决我的问题,但是这个解决方案可以解决!谢谢!
贾斯珀·霍尔顿

4

刚遇到其他有相同问题的人提出了这个问题。

Oracle Bug数据库#7095006

使用以下代码来避免InputStream步骤。是InputStream导致错误。

URL url = AudioMixer.class.getResource(fileName); 
AudioInputStream ais =  AudioSystem.getAudioInputStream(url); 

瞧-没有InputStream

getAudioInputStream()期间标记/重置异常


1
在哪里可以获得AudioMixer?我尝试了类似文章中的链接,但该链接指向其他地方。
Potney Switters,2012年

2
@Potney抱歉。AudioMixer确实看起来像是核心Java类的名称,但这只是我编写的类。我将其在代码源中的目录位置用作查找“文件名”的起点。docs.oracle.com/javase/tutorial/uiswing/components/icon.html如果您还不熟悉,请参阅上面教程中的“使用getResource加载图像”一节。
Phil Freihofner,2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.