Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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.io.IOException:不支持标记/重置_Java_Audio_Ioexception - Fatal编程技术网

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

java.io.IOException:不支持标记/重置,java,audio,ioexception,Java,Audio,Ioexception,当我从netbeans运行应用程序时,这段代码运行良好。声音响起,没有例外。但是,当我从dist文件夹运行它时,声音不会播放,我在消息对话框中得到java.io.IOException:mark/reset not supported 如何解决此问题?问题是您的输入流必须支持标记和重置方法。至少在支持标记的情况下,您可以使用测试: 因此,您可能应该使用不同的输入流。的文档说明: 此方法的实现可能会 需要多个解析器来检查 检查流以确定它们是否正确 支持它。这些解析器必须能够 要标记流,请读取足够的

当我从netbeans运行应用程序时,这段代码运行良好。声音响起,没有例外。但是,当我从dist文件夹运行它时,声音不会播放,我在消息对话框中得到
java.io.IOException:mark/reset not supported


如何解决此问题?

问题是您的输入流必须支持标记和重置方法。至少在支持标记的情况下,您可以使用测试:

因此,您可能应该使用不同的输入流。

的文档说明:

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

因此,提供给此方法的流必须支持可选功能。用一个新的图标装饰你的资源流


在挣扎了一段时间并多次引用此页面后,我无意中发现了帮助我解决问题的方法。我最初能够加载一个wav文件,但后来只能播放一次,因为由于“mark/reset not supported”(标记/重置不受支持)错误,它无法回放。真让人发疯

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

//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);
最后,它将读取的数据转换为PCM编码:

audioInputStream = AudioSystem.getAudioInputStream(new File(filename));
BufferedInputStream bufferedInputStream = new BufferedInputStream(audioInputStream);
audioInputStream = new AudioInputStream(bufferedInputStream, audioInputStream.getFormat(), audioInputStream.getFrameLength());
convertToPCM定义为:

audioInputStream = convertToPCM(audioInputStream);

我相信他们这样做是因为BufferedInputStream比audioInputStream更好地处理标记/重置。希望这对其他人有所帮助。

刚刚从引用它的具有相同问题的其他人那里遇到这个问题

Oracle错误数据库#7095006

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

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;
}
瞧,没有输入流


Ty,这起作用了。我修改了如下代码:
BufferedInputStream myStream=new BufferedInputStream(getClass().getResourceAsStream(“mySound.au”);AudioInputStream audio2=AudioSystem.getAudioInputStream(myStream)现在它可以工作了=)P.S.如果有人能格式化这个评论,那就太好了=/这就是mark/reset的意思吗?一条可以找到的小溪@McDowell,你能在回答中显示修饰过的代码吗?@Shurane-mark/reset允许在调用reset时将“未读”数据流回标记点(通常是通过在RAM中缓冲mark调用时的数据)。这还不够。无法找出为什么我的音频没有从文件中正确加载。因为我是从一个文件加载的,所以这样做对我来说比较容易:FileInputStream fs=newfileinputstream(filename);BufferedInputStream myStream=新的BufferedInputStream(fs);AudioInputStream AudioInputStream=AudioSystem.getAudioInputStream(myStream);嘿@SauceMaster我使用了这种方法,因为我也试图打开一个文件,但它仍然无法编译。我得到:“java.io.IOException:streamclosed”。当它面对320kbps的比特率时,它似乎是这样工作的,而在112中它工作得很好。我在哪里可以买到音频混音器?我尝试了你在类似帖子中的链接,但它指向了其他地方。@Potney对此表示抱歉。AudioMixer看起来确实可能是一个核心Java类的名称,但它只是我编写的一个类。我使用它在代码源中的目录位置作为定位“文件名”的起点。如果您还不熟悉,请参阅上述教程中的“使用getResource加载图像”部分。这里的其他解决方案对我的问题不起作用,但这一个解决了!谢谢
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;
}
URL url = AudioMixer.class.getResource(fileName); 
AudioInputStream ais =  AudioSystem.getAudioInputStream(url);