2015-06-18 2 views
1

в моем затмении, когда я запускаю его, все работает отлично, а звук в порядке, но у меня проблема, когда я создаю исполняемый файл .jar. Аудиофайл находится в моем пакете, и я читаю его с помощью getResourceAsStream, поэтому просто хочу сообщить вам. Вот проблема ..чтение звука в jar исполняемый файл

InputStream input = getClass().getResourceAsStream("/optician/funny-doorbell.wav"); 
AudioInputStream audioIn; 
try{ 
Clip clip; 
audioIn = AudioSystem.getAudioInputStream(input); 
clip=AudioSystem.getClip(); 
clip.open(audioIn); 
clip.start(); 
} catch (UnsupportedAudioFileException | IOException e1) { 
e1.printStackTrace(); 
} catch (LineUnavailableException e1) { 
e1.printStackTrace(); 
} 

В первом случае, когда я бегу с затмением, он отлично работает, но когда я запустить исполняемый файл .jar я получаю: сброс/метки не поддерживается.

Второй случай все же, но:

BufferedInputStream input = (BufferedInputStream) getClass().getResourceAsStream("/optician/funny-doorbell.wav"); 

Так все же, точка зрения такова, что я сейчас попробую с BufferedInputStream, но проблема я получаю сейчас: Исключение в потоке «АВТ-EventQueue-0» java.lang.ClassCastException: sun.new.www.protocol.jar.JarURLConnection $ JarURLInputStream не может быть добавлен в java.io.BufferedInputStream

Я пробовал в linux и windows, но он не работает. В чем проблема ?

ответ

1

Я думаю, что этот вопрос был задан и ответил ранее. Смотрите принятый ответ здесь для подробного объяснения: java.io.IOException: mark/reset not supported

То есть, я полагаю, вы можете исправить свой код, изменив свою первую строку следующим образом:

InputStream input = new BufferedInputStream(getClass().getResourceAsStream("/optician/funny-doorbell.wav")); 

Причину вы видите разницу в поведении заключается в том, что в Eclipse getResourceAsStream возвращает InputStream, который поддерживает чтение/метку. Когда вы заканчиваете банку, вы получаете реализацию InputStream, которая не поддерживает чтение/метку (JarURLInputStream).

Если вы переносите возвращаемый поток ввода в новый BufferedInputStream, у вас будет поддержка чтения/метки в потоке, когда вы работаете в банке, и ваш код будет работать повсюду.

Кроме того, вы получаете ClassCastException, потому что пытаетесь передать поток ввода, возвращаемый getResourceAsStream(), в BufferedInputStream. Не бросайте его; вместо этого оберните возвращаемый поток ввода в новый BufferedInputStream(), как и в приведенном выше фрагменте кода.

+0

Это помогло, спасибо за помощь и объяснение! –