2011-02-07 5 views
0

Я упаковал все файлы классов и ресурсы как банку, но при исполнении звуковых файлов не будет играть. Мой пакет структура:звук не играет в банке

+project 
|_classes 
|_ _*.class 
|_resources 
|_ _ *.jpg,*.wav 

Код:

AudioInputStream inputStream = AudioSystem.getAudioInputStream(kidsClassRoom.class.getResourceAsStream("../resources/"+file)); 

получить null, когда эта линия выполнена !!

ответ

0

Когда вы делаете getResourceAsStream, это не относится к текущему классу, а к корню архива. То есть, сначала попробуйте удалить ../.

+0

удален «../» все еще не работает! – sarath

+0

Попробуйте щелкнуть правой кнопкой мыши папку ресурсов и выбрать «Путь сборки -> Использовать в качестве исходной папки». (Это делается только для того, чтобы файлы были доступны для загрузчика классов при запуске из eclipse.) – aioobe

+0

Я не использую никакой IDE сейчас :) – sarath

1

Создать пакет с именем resources, как показано ниже enter image description here

затем

AudioSystem.getAudioInputStream(kidsClassRoom.class.getResourceAsStream("resources/"+file)); 
+0

обязательна ли папка с именем «resources»? – sarath

+0

Нет никакой папки 'Foo', но тогда' kidsClassRoom.class.getResourceAsStream ("Foo /" + file) ' –

+0

did not work too !! – sarath

2

Альтернативным теории к уже представлены. Часто успешные вызовы getResource() зависят от экземпляра загрузчика класса, который вызывается для их обнаружения. По этой причине я бы рекомендовал использовать экземпляр пользовательского объекта, из которого можно вызвать getResource(). НАПРИМЕР.

// Sanity check 
System.out.println("The value of 'file' is: " + file); 
// Presuming kidsClassRoom1 is an instance of kidsClassRoom 
AudioInputStream inputStream = AudioSystem. 
    getAudioInputStream(
     kidsClassRoom1. 
      getClass(). 
      getResourceAsStream("/resources/"+file)); 

Вы также можете заметить, что фрагмент использует префикс «/» для ресурса. Вопреки тому, что говорят другие, я уверен, что это означает «из корня» пути ресурса, в любом Jar на пути класса времени выполнения. Если вы оставите «/» или «../», будет загружен загрузчик классов для поиска ресурса в подпути класса, в котором это происходит.

Конечно, убедитесь, что Wav попал в Jar! Скопируйте/переименуйте .jar в .zip и дважды щелкните по нему «быстрый & грязный» способ проверить содержимое архива в Windows.

+0

вы можете объяснить, почему kidsClassRoom1.getClass() лучше, чем kidsClassRoom .класс? – sarath

+0

Я не уверен, что это так. Существуют разные загрузчики классов. Загрузочный загрузчик класса bootstrap, используемый для загрузки вещей из J2SE, не будет обнаруживать классы или ресурсы во время выполнения класса приложения. Лучший загрузчик классов для поиска приложения. Ресурсы - это загрузчик класса контекста. Использование className.class ** может ** произвести загрузчик контекстного класса, а может и нет. OTOH, используя экземпляр фактического объекта настраиваемого класса, гарантирует загрузчик класса контекста. Но самое главное - помогает ли вам этот совет? Является ли wav-файл «найденным»? –

+0

kidsClassRoom.class способ работал для меня. Проблема в том, что я дал неправильное имя файла !! – sarath

1

Это моя функция для воспроизведения звукового файла цикла в баночках, он отлично работает для меня.

Похоже, что getResourceAsStream() не работает с баночками. однако getResource().

public synchronized void alarm() { 
    try { 
     crit = AudioSystem.getClip(); 
     AudioInputStream inputStream1 = AudioSystem.getAudioInputStream(this.getClass().getResource("critical.wav")); 
     crit.open(inputStream1); 
     crit.loop(Clip.LOOP_CONTINUOUSLY); 

    } catch (Exception e) { 
     System.err.println(e.getMessage()); 
     } 
} 
+0

Для меня это работает. большое спасибо – Sk1X1

0

Важно отметить, что в экспортированной банку ресурсы не хранятся в виде файлов (Прочитано это где-то, кто-то более знающий вход пожалуйста). Поэтому лучше всего получить ресурс как объект URL, а затем передать его объекту AudioInputStream.

URL url = YourClass.class.getResource(filename); 
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url); 

Если ресурс находится в подпапке, не забудьте добавить его в путь к файлу.