[英]play .wav file from jar as resource using java
我想使用java代碼播放.wav文件,該代碼位於jar文件中作為資源。 我的代碼看起來像這樣 -
try {
URL defaultSound = getClass().getResource("/images/ads/WindowsNavigationStart.wav");
// getClass().getSy.getResource("/images/ads/WindowsNavigationStart.wav");
File soundFile = new File(defaultSound.toURI());
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundFile);
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
clip.start( );
} catch (Exception ex) {
ex.printStackTrace();
}
WindowsNavigationStart.wav文件存在於我的一個jar文件中。 但得到以下例外 -
java.lang.IllegalArgumentException: URI is not hierarchical
at java.io.File.<init>(File.java:363)
at au.com.webscan.wwwizard.app.admin.customfile.UpOneLevelFolder.btnUpFolderActionPerformed(Unknown Source)
at au.com.webscan.wwwizard.app.admin.customfile.UpOneLevelFolder.access$000(Unknown Source)
at au.com.webscan.wwwizard.app.admin.customfile.UpOneLevelFolder$1.actionPerformed(Unknown Source)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
at java.awt.Component.processMouseEvent(Component.java:6288)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6053)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4651)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:616)
at java.awt.EventQueue$2.run(EventQueue.java:614)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
請給我一個解決方案。 謝謝你們。
你有沒有嘗試過:
InputStream is= getClass().getResourceAsStream("/images/ads/WindowsNavigationStart.wav");
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(is);
基本上我認為你不能在jar文件中用URI創建一個文件。 但是您可以直接傳遞輸入流。
更改:
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundFile);
至:
System.out.println("defaultSound " + defaultSound); // check the URL!
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(defaultSound);
獲得inputStream的句柄后,獲取audioInputStream並完成剩下的工作。
InputStream is = getClass().getResourceAsStream("......");
AudioInputStream ais = AudioSystem.getAudioInputStream(is);
Clip clip = AudioSystem.getClip();
clip.open(ais);
完美解決方案.......
URL url = this.getClass().getResource("sounds/beep.au");
String urls=url.toString();
urls=urls.replaceFirst("file:/", "file:///");
AudioClip ac=Applet.newAudioClip(new URL(urls));
ac.play();
在制作單jar java應用程序時,請參考我之前的回答。 標題是誤導性的,但海報試圖做一些幾乎與你相同的事情。 一些最佳細節位於聊天記錄的鏈接中。
try {
AudioPlayer.player.start(new AudioStream(getClass().getResourceAsStream("/sound/SystemNotification.wav")));
} catch (Exception e) {
e.printStackTrace();
}
這對我來說很好:
public void playSound() {
InputStream in;
try {
in = new BufferedInputStream(new FileInputStream(new File(
getClass().getClassLoader()
.getResource("com/kaito/resources/sound.wav").getPath())));
AudioStream audioStream = new AudioStream(in);
AudioPlayer.player.start(audioStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
以下允許我在Eclipse項目和導出的jar文件中播放聲音:
- 注意使用BufferedInputStream
- 注意,使用inputStream而不是file。
在我的main()中:
playAlarmSound();
在我班上:
public static void playAlarmSound() {
ClassLoader classLoader = App.class.getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("alarmsound.wav");
try {
Clip clip = AudioSystem.getClip();
AudioInputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(inputStream));
clip.open(ais);
clip.start();
} catch (IOException | LineUnavailableException | UnsupportedAudioFileException e) {
System.err.println("ERROR: Playing sound has failed");
e.printStackTrace();
}
}
像Kal寫道:
- InputStream = getClass()。getResourceAsStream(“......”);
- AudioInputStream ais = AudioSystem.getAudioInputStream(is); ...
我這樣做了,它起初沒有用,但是“java.io.IOException”的問題是我使用了File.separator,由於某種原因,win 8.1無法處理“\\\\”......
public AudioInputStream getSound(String fileName){
InputStream inputSound;
AudioInputStream audioInStr;
String fs = File.separator;
try {
absolutePath = fs +packageName+ fs +folderName+ fs +fileName;
inputSound = getClass().getResourceAsStream(absolutePath);
//if null pointer exception try unix, for some reason \\ doesn't work on win 8.1
if(inputSound == null) {
absolutePath = "/" + packageName + "/" + folderName + "/" + fileName;
inputSound = getClass().getResourceAsStream(absolutePath);
}
audioInStr = AudioSystem.getAudioInputStream(new BufferedInputStream(inputSound));
return audioInStr;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.