2015-06-07 2 views
2

У меня есть следующий код в статическом методе:Почему getResourceAsStream() не работает в JAR-файлах?

clips.open(AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("folder/sound.wav"))); 

Кроме того, folder находится в том же каталоге, что и Sound.java. Когда я запускаю программу в Eclipse, воспроизводится звук. Однако, когда я экспортирую файл в JAR-файл, звук больше не воспроизводится.

Если я изменю getResourceAsStream() на getResource(), как Eclipse, так и JAR-файл воспроизводят звук. Почему это происходит? Я читал, и многие люди считают, что getResourceAsStream() просто не работает в JAR-файлах. Это так, и если да, почему бы и нет?

+1

Я сомневаюсь, что ваш 'getResource' работает по-разному в случае JAR. –

+0

Нет. С помощью getResource() файл JAR правильно воспроизводит звук. Другие также наблюдают это, например [здесь] (http://stackoverflow.com/a/15311535) и [здесь] (http://stackoverflow.com/a/16048907). – Kootling

+0

Интересные ссылки. Я замечаю, что в этих потоках они не следуют с установлением истинной причины, по которой один работает, а другой - нет. Я подозреваю, что это связано с использованием InputStream или нет (согласно моему ответу). Но также имеет смысл заявить, что жизнь слишком коротка, и если у вас есть что-то, что работает, двигайтесь дальше! –

ответ

0

Я подозреваю, что проблема в том, что Class.getResourceAsStream (String) возвращает InputStream и Class.getResource (String) возвращает URL. Таким образом, в первом случае, мы, в сущности, с помощью

AudioSystem.getAudioInputStream(InputStream inputStream) 

и во втором случае, используя

AudioSystem.getAudioInputStream(URL url). 

Почему это важно? Я думаю, что основная проблема заключается в том, что когда параметр InputStream является параметром, тесты метки/сброса выполняются в вашем звуковом файле, и он не работает. Когда в качестве параметра используется URL, этот тест не возникает. Вы можете проверить API для AudioSystem.getAudioInputStream, чтобы подтвердить, что я сообщаю здесь.

У вас появляется сообщение об ошибке, когда getResourceAsStream не удается? Означает ли это ошибку ошибки метки/сброса случайно? Если вы получаете другое сообщение об ошибке, это может быть не правильный ответ, а что-то еще происходит.

+0

Ошибка отметки/сброса. Однако при печати трассировки стека есть несколько 'FileNotFoundException'. Однако это ожидается. Как работает моя программа, пользователь выбирает папку, содержащую файлы, и эти файлы загружаются в программу. Следовательно, могут быть моменты, когда у пользователя нет определенного файла (который не требуется), и это не должно быть проблемой. Кроме того, я получаю 'FileNotFoundException' для' getResource() 'и' getResourceAsStream() ', поэтому это не должно быть причиной того, что звуки не воспроизводятся с' getResourceAsStream() '. – Kootling

+0

1) Можете ли вы изолировать сообщение об ошибке для экземпляра с ошибкой? Другими словами, попробуйте загрузить файл, который, как вы знаете, не существует, и не должен вызывать «не найден» и возникает ошибка при использовании getResourceAsStream, но не GetResource? 2) У меня когда-то была ситуация, когда этап InputStream потерпел неудачу (из-за отметки/сброса), но вызывающий метод, getAudioInputStream() отреагировал на этот сбой, сообщив об этом как «файл не найден», а не передал ошибку нижнего уровня. Информация, которую вы только что дали мне, не полностью исключает эту возможность, хотя истинная причина остается загадкой. –