2013-01-06 118 views
1

我想从jar文件本身加载一个mp3文件,然后用JLayer播放。当我尝试这样做时,我得到一个NullPointerException或一个FileNotFoundException。任何想法如何解决这个问题?从Jar中加载JLayer的mp3文件

//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) { 

    } 


} 

回答

2

你的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