Java.io. IOException: Марк / сброс не поддерживается


try {
    //String location = dir1.getCanonicalPath()+"app_yamb_test1mySound.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 в моем диалоговом окне сообщения.

Как я могу это исправить?

4 56

4 ответа:

документация AudioSystem.getAudioInputStream(InputStream) говорит:

реализация этого метода может требуется несколько парсеров для проверки поток, чтобы определить, являются ли они поддерживать ее. Эти Парсеры должны быть в состоянии чтобы отметить поток, прочитайте достаточно данных чтобы определить, поддерживают ли они поток, и, если нет, сбросить указатель чтения потока на его оригинал позиция. Если входной поток не поддерживать эти операции, этот метод может не с IOException.

поэтому поток, который вы предоставляете этому методу, должен поддерживать необязательный mark / reset функциональность. Украсьте свой поток ресурсов с помощью 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);

после того, как я некоторое время барахтался и много раз ссылался на эту страницу, я наткнулся на этой, который помог мне с моей проблемой. Сначала я смог загрузить wav-файл, но впоследствии смог воспроизвести его только один раз, потому что он не мог перемотать его из-за ошибки "mark/reset not supported". Это сводило с ума.

связанный код считывает 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. Надеюсь, это поможет кому-то там.

просто наткнулся на этот вопрос от кого-то еще с той же проблемой, кто ссылался на него.

база данных ошибок Oracle, #7095006

используйте следующий код, чтобы избежать шага InputStream. Это входной поток, который вызывает ошибку.

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

вуаля - нет InputStream

Марк/сброс исключение во время getAudioInputStream ()

проблема в том, что вы входной поток должен поддерживать методы mark и reset. По крайней мере, если Марк поддерживается, вы можете проверить с: AudioInputStream#markSupported.

Так что вы должны, возможно, использовать другой InputStream.