简体   繁体   English

使用java从jar作为资源播放.wav文件

[英]play .wav file from jar as resource using java

I want to play a .wav file using java code which is in a jar file as resource. 我想使用java代码播放.wav文件,该代码位于jar文件中作为资源。 My code is look like this - 我的代码看起来像这样 -

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();
}

The file WindowsNavigationStart.wav is exist in one of my jar file. WindowsNavigationStart.wav文件存在于我的一个jar文件中。 But getting the following exception - 但得到以下例外 -

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)

Please give me a solution. 请给我一个解决方案。 Thank you all. 谢谢你们。

Have you tried: 你有没有尝试过:

InputStream is= getClass().getResourceAsStream("/images/ads/WindowsNavigationStart.wav");
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(is);

Essentially I do not think you can create a File out of a URI in the jar file. 基本上我认为你不能在jar文件中用URI创建一个文件。 But you can pass the input stream directly. 但是您可以直接传递输入流。

Change: 更改:

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundFile);

To: 至:

System.out.println("defaultSound " + defaultSound);  // check the URL!
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(defaultSound);

Use Class.getResourceAsStream() 使用Class.getResourceAsStream()

Once you have a handle to the inputStream, get the audioInputStream and do the rest. 获得inputStream的句柄后,获取audioInputStream并完成剩下的工作。

InputStream is = getClass().getResourceAsStream("......");
AudioInputStream ais = AudioSystem.getAudioInputStream(is);
Clip clip = AudioSystem.getClip();
clip.open(ais);

Perfect Solution....... 完美解决方案.......

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();

Please refer to my previous answer at making a single-jar java application . 制作单jar java应用程序时,请参考我之前的回答。 The title is misleading, but the poster was trying to do something almost identical to you. 标题是误导性的,但海报试图做一些几乎与你相同的事情。 Some of the best details are in the link to the chat log. 一些最佳细节位于聊天记录的链接中。

     try {
        AudioPlayer.player.start(new AudioStream(getClass().getResourceAsStream("/sound/SystemNotification.wav")));
    } catch (Exception e) {
        e.printStackTrace();
    }

this worked fine for me: 这对我来说很好:

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();
        }
    }

The following allows me to play a sound in Eclipse project and an exported jar file: 以下允许我在Eclipse项目和导出的jar文件中播放声音:
- note the BufferedInputStream is used - 注意使用BufferedInputStream
- Note, inputStream is used instead of file. - 注意,使用inputStream而不是file。

In my main(): 在我的main()中:

playAlarmSound();

in my class: 在我班上:

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();
}
}

like Kal wrote : 像Kal写道:

  1. InputStream is = getClass().getResourceAsStream("......"); InputStream = getClass()。getResourceAsStream(“......”);
  2. AudioInputStream ais = AudioSystem.getAudioInputStream(is);... AudioInputStream ais = AudioSystem.getAudioInputStream(is); ...

I did just that and it didn't work at first but the problem of "java.io.IOException" was that I used File.separator and for some reason win 8.1 couldn't handle "\\\\"... 我这样做了,它起初没有用,但是“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM