2016-03-10 4 views
0

У меня проблема с воспроизведением звуков в моем приложении Java. Звук воспроизводится, когда пользователь получает сообщение. Все работает на OS X, но в Windows это не так. Я помещаю файл в jar, используя эту команду: jar uf client.jar getMsgSound.wav. Я полагаю, что проблема заключается в поиске этого файла.Звук Java не работает в Windows, но работает на OS X

public String soundName = "getMsgSound.wav"; 

public void playSound() 
{ 
try { 
    File soundFile = new File(soundName); 
    AudioInputStream audioIn = AudioSystem.getAudioInputStream(soundFile); 
    Clip clip = AudioSystem.getClip(); 
    clip.open(audioIn); 
    clip.start(); 

    } catch (UnsupportedAudioFileException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (LineUnavailableException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Я предполагаю, что звук работает на машине Windows, и он не отключен? –

+0

Объекты в банке не являются файлами, и вы не можете использовать 'File' для доступа к ним. Читайте о 'getResourceAsStream'. –

+0

URL-адрес будет работать в банках. Файл не работает внутри Jar. –

ответ

1

Даже если это на Mac OS, я не думаю, что вы можете прочитать файл из банки таким образом. Возможно, вы просто захотите разместить файл где-нибудь в своем проекте и загрузить его.

Я только что протестировал с чтением файла напрямую, не помещая его в банку, он работал как для Mac OS, так и для Windows.

Так как Greg просто указал в комментариях, вы должны загрузить его из файла jar с помощью ClassLoader.

См. this post, как загрузить ресурсы с помощью ClassLoader.

+0

Вы правы. Я поставил OS X file.wav с моей банкой, вот почему он работал здесь. В Windows был только файл jar. Это сработало для меня: public String soundName = "/getMsgSound.wav"; InputStream in = getClass(). GetResourceAsStream (soundName); AudioInputStream audioIn = AudioSystem.getAudioInputStream (in); добавить файл в банку с мавена: SRC/ресурсы getMsgSound.wav Isnarf

+0

Да, всегда следует использовать класс Loader для загрузки файлов ресурсов. –