java - 使用 JLayer 从 Jar 中加载 mp3 文件

标签 java jlayer

我想从 jar 文件本身加载 mp3 文件,然后用 JLayer 播放它。当我尝试这样做时,我要么得到 NullPointerException,要么得到 FileNotFoundException。知道如何解决这个问题吗?

//MP3Player.java

package Music;

import java.io.BufferedInputStream;
import java.io.FileInputStream;

import javazoom.jl.player.Player;

public class MP3Player extends Thread
{
   private String filename;
   private Player player; 
   private Thread mp3Thread;
   private boolean playing;
   private boolean locked;

   // constructor that takes the name of an MP3 file
   public MP3Player() 
   {
      this.filename = "";
      mp3Thread = null;
      playing = true;
      locked = true;
   }

   public void run()
   {
      while (playing)
         play();
   }

   public void play() 
   {
      if (!locked)
      {
         if (filename != null && filename != "")
         {
            try
            {
               FileInputStream fis     = new FileInputStream(filename);
               BufferedInputStream bis = new BufferedInputStream(fis);
               player = new Player(bis);

               mp3Thread = new Thread() 
               {
                  public void run() 
                  { try { player.play(); } catch (Exception e) { System.out.println(e); } }
               };

               mp3Thread.start();
            //   mp3Thread.join();
            } catch (Exception e) { System.out.println(e); }
         }
      }
   }

   public void changeMusic(String newGuy)
   {
      locked = true;
      filename = "";
      try
      {
         if (player != null)
            player.close();
         mp3Thread = null;

         filename = newGuy;

         locked = false;
      }
      catch (Exception e) {}
   }

   public void close() 
   {
      locked = true;
      playing = false; 

      try 
      { 
         if (player != null) 
            player.close(); 

         if (mp3Thread != null)
            mp3Thread = null;
      } catch (Exception e) {}
   }

// MusicHandler.java 
package Music;

import java.io.File;
import javax.swing.*;
public final class MusicHandler {

    public MusicHandler() {

    }
    public void PlayBoundlessMusic() {
        try {
            String myFile = (getClass().getResource("/Boundless/Twilight.mp3").getPath());
        MP3Player player = new MP3Player();
        player.changeMusic(myFile);
        player.play();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            JOptionPane.showMessageDialog(null, e);
        }
    }
    private void PlayMusic(File f) {

    }


}

最佳答案

你的MP3就是所谓的嵌入式资源,它不像文件(事实上它甚至不能被认为是文件)。我们有时将它们视为虚拟文件。

您需要获取嵌入资源的InputStream,而不是尝试使用FileInputStream读取文件。

您应该使用 getClass().getClassLoader().getResourceAsStream(fileName) 它将返回 InputStream...

请记住,如果您打开一个流,您就有责任关闭它...

InputStream fis = null;
BufferedInputStream bis = null;
try
{
    fis = getClass().getClassLoader().getResourceAsStream(fileName);
    bis = new BufferedInputStream(fis);
    player = new Player(bis);

    mp3Thread = new Thread() 
    {
        public void run() 
        { try { player.play(); } catch (Exception e) { System.out.println(e); } }
    };

    mp3Thread.start();
    //   mp3Thread.join();
} catch (Exception e) { System.out.println(e); }
} finally {
    try {
        fis.close();
    } catch (Exception e) {}
    try {
        bis.close();
    } catch (Exception e) {}
}

当然,您可以利用 Java 7 的 auto close (or try-with-resources) feature

关于java - 使用 JLayer 从 Jar 中加载 mp3 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180023/

相关文章:

java - 滚动 JLayer 的行为与它应该替换的滚动 JPanel 不同

java - 使用 JLayer 时更改 Java 中的音量

java - 使用 JLayer 分割和淡入淡出 MP3 文件

java - 如何导入我下载的这些 Java 类?

java - 如何在不同网络的 NAT 后面的两个客户端之间建立 TCP 连接?

java - 如何将仅获取选定的子实体与父实体连接起来

java - 网址本地主机 :8080/<project_name>/Servlet don't works

java - 使用JLayer播放mp3资源

java - IE 浏览器 Windows 8.1 的鼠标悬停问题

java - 在 BroadcastReceiver() 中检索调用上下文