【问题标题】:play .wav file from jar as resource using java使用java将jar中的.wav文件作为资源播放
【发布时间】:2012-01-15 13:32:41
【问题描述】:

我想使用 jar 文件中的 java 代码作为资源来播放 .wav 文件。我的代码是这样的 -

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)

请给我一个解决方案。谢谢大家。

【问题讨论】:

  • 你的 wav 在哪里?如果它与您的 java 一起压缩,则无法使用 URI 创建 File 对象。但是,使用 InputStream 是可能的。
  • 在ant build创建的jar文件中。

标签: java audio resources jar


【解决方案1】:

请参考我之前在making a single-jar java application 的回答。标题具有误导性,但张贴者试图做的事情几乎与您相同。聊天记录的链接中提供了一些最好的详细信息。

【讨论】:

    【解决方案2】:

    你试过了吗:

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

    基本上我认为您不能从 jar 文件中的 URI 创建文件。但是您可以直接传递输入流。

    【讨论】:

    • 我得到以下异常java.io.IOException: mark/reset not supported
    • @Pritorn,要克服 IOException,请将 InputStream 包装在 BufferedInputStream 中。完整的解决方案是:InputStream is= getClass().getResourceAsStream("/images/ads/WindowsNavigationStart.wav"); AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new BufferedInputStream(is));
    • 感谢 BufferedInputStream 提示。这对我来说完全不同。
    【解决方案3】:

    使用Class.getResourceAsStream()

    获得 inputStream 的句柄后,获取 audioInputStream 并完成剩下的工作。

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

    【讨论】:

    • 我得到以下异常java.io.IOException: mark/reset not supported
    【解决方案4】:

    变化:

    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundFile);
    

    收件人:

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

    【讨论】:

    • 我收到以下defaultSound jar:file:/E:/console2012/console2012/lib/pics-webcommerce.jar!/images/ads/WindowsNavigationStart.wav javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input URL,我的 wav 文件出错?
    • Wav 是一种“容器格式”。它可能有许多不同类型的编码。 Java 只理解其中的一些编码。试试这个sample media页面上的左/右wav。
    • 你好,这对我有用。尝试{ URL defaultSound = this.getClass().getResource(thePathToFile); AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(defaultSound);剪辑剪辑 = AudioSystem.getClip();剪辑.打开(音频输入流);剪辑.start(); } 捕捉(异常前) {ex.printStackTrace();}
    【解决方案5】:

    完美解决方案......

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

    【讨论】:

      【解决方案6】:
           try {
              AudioPlayer.player.start(new AudioStream(getClass().getResourceAsStream("/sound/SystemNotification.wav")));
          } catch (Exception e) {
              e.printStackTrace();
          }
      

      【讨论】:

        【解决方案7】:

        这对我来说很好用:

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

        【讨论】:

          【解决方案8】:

          以下允许我在 Eclipse 项目中播放声音和导出的 jar 文件:
          - 注意使用了 BufferedInputStream
          - 注意,使用的是 inputStream 而不是文件。

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

          【讨论】:

            【解决方案9】:

            就像 Kal 写的:

            1. InputStream is = getClass().getResourceAsStream("......");
            2. 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;
                }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-11-08
              • 2022-06-21
              • 1970-01-01
              • 1970-01-01
              • 2011-05-06
              • 1970-01-01
              • 2018-08-17
              • 2013-03-17
              相关资源
              最近更新 更多