Поток чтения исключений Java из ресурса .wav - PullRequest
3 голосов
/ 12 марта 2012

Полагаю, мой код в порядке, а мой .jar-файл в порядке с .wav внутри него .. Но когда я пытаюсь загрузить его с помощью getResourceAsStream, я получаю сообщение об ошибке ..

это моя ошибка:

java.io.IOException: mark/reset not supported
    at java.util.zip.InflaterInputStream.reset(Unknown Source)
    at java.io.FilterInputStream.reset(Unknown Source)
    at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(Unkno
wn Source)
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
    at operation.MainWindowOperations.prepareAudio(MainWindowOperations.java
:92)
    at operation.MainWindowOperations.<init>(MainWindowOperations.java:81)
    at graphics.LaunchGraphics.<init>(LaunchGraphics.java:25)
    at run.RunApp.main(RunApp.java:14)

это мой код:

private void prepareAudio() {
    try {

        InputStream is = this.getClass().getClassLoader().getResourceAsStream("beep.wav");
        inputStream = AudioSystem.getAudioInputStream(is);
        clip = AudioSystem.getClip();
        clip.open(inputStream);

    } catch (Exception ex) {
        ex.printStackTrace();

    }

}

Может ли кто-нибудь мне помочь? заранее большое спасибо !!

Ответы [ 2 ]

6 голосов
/ 12 марта 2012

Java Sound для некоторых операций требует перемещения (поддерживается отметка / сброс) входных потоков. Если вы столкнулись с этой проблемой, то это потому, что поток не может быть перемещен.

Один из способов обойти это - поместить byte[] исходного потока в ByteArrayInputStream, который поддерживает метку / сброс.


Второй ответ на вопрос, связанный с Эриком Р., также возможен и выглядит проще. Чтобы попробовать, измените ..

InputStream is = this.getClass().getClassLoader().getResourceAsStream("beep.wav");
inputStream = AudioSystem.getAudioInputStream(is);

Кому:

URL url = this.getClass().getClassLoader().getResource("beep.wav");
inputStream = AudioSystem.getAudioInputStream(url);
1 голос
/ 12 марта 2012

Я получил ответ с помощью Тима Мура из JavaRanch. Я думал, что самым ясным было бы просто опубликовать это здесь, хотя Эндрю упоминает этот правильный ответ во второй части своего ответа. (Первая часть тоже работает, но излишне.)

Url url = this.getClass().getResource("beep.wav");           
inputStream = AudioSystem.getAudioInputStream(url);

http://www.coderanch.com/t/558274/Applets/java/mark-reset-not-supported-getResourceAsStream

Тим написал: У меня нет особых знаний об этой проблеме или аудио в апплетах в общем, но я не удивлен, что mark / reset не работает с ресурсы, полученные с помощью механизма ClassLoader. (На самом деле, я отчасти удивлен, что это работает вообще, по крайней мере, иногда :-)

Предполагая, что аудиофайл общедоступен через HTTP, попробуйте AudioSystem.getAudioInputStream (URL) вместо InputStream версия, которую вы используете сейчас. Глядя на javax.sound.sampled.spi.AudioFileReader javadocs (который является классом используется под), только вариант InputStream говорит о пометьте / сбросьте проблемы, а не версию URL.

Это также пришло сюда: https://forums.oracle.com/forums/thread.jspa?threadID=2289395&tstart=0 и ответ находится в самом низу вместе с Oracle Bug Reference # 7095006, которая представляет интересное прочтение, поскольку объясняет, почему код (как изначально пытался выполнить) работал, но больше не работает.

...