如何读取JAR包中的midi声音资源文件

  问题的根源还是在于老生常谈的所谓class path,不信的话你在系统环境变量里的ClassPath加上你的jar文件,这下你就看得到你的图片了!但单独发布jar的话不可能指望每次都让用户为你的jar而专门修改classpath。那么有没有什么办法一劳永逸地搞定它呢?我们需要从类的装载入手。先扯远一点,在开发JSP之类的Web应用程序的时候要用到第三方的库怎么办?通常的做法是把这些库(可以是class,也可以是jar)统统放到WEB-INF/lib/目录下面,为什么这样系统就认了呢?因为Web容器(譬如Tomcat)在装载类的时候有自己的组织方式(可以参考Tomcat手册http://jakarta.apache.org/tomcat/tomcat-4.1-doc/class-loader-howto.html)。特别地,jar也是类装载器的一个可访问媒介,ClassLoader提供了两个方法用于从装载的类路径中取得资源:

  public URL getResource(String name);

  public InputStream getResourceAsStream(String name);

  这里name是资源的类路径,它是相对与“/”根路径下的位置。getResource得到的是一个URL对象来定位资源,而getResourceAsStream取得该资源输入流的引用保证程序可以从正确的位置抽取数据。

  真正使用的不是ClassLoader的这两个方法,而是Class的getResource和getResourceAsStream方法,因为Class对象可以从你的类得到(如YourClass.class或YourClass.getClass()),而ClassLoader则需要再调用一次YourClass.getClassLoader()方法,但根据JDK文档的说法,Class对象的这两个方法其实是“委托”(delegate)给装载它的ClassLoader来做的,所以只需要使用Class对象的这两个方法就可以了。

下面是我的解决办法:

InputStream file = this.getClass().getResourceAsStream("/1d.txt");

this是当前类实例,通过当前类实例来获取,"/1d.txt"为相对与当前的classes文件夹 ,

public void readFromJar() throws IOException{

              InputStream file = this.getClass().getResourceAsStream("/1d.txt");//可以正常使用      

//     InputStream file = RReader.class.getResourceAsStream("/reader/3d.txt");//错误

//     InputStream file = this.getClass().getResourceAsStream("3d.txt");//如果使用相对路径,则需要资源文件和class文件的相对位置容易确定

       int temp = 0;

       while((temp = file.read()) != -1){

                  content +=(char)temp;

       }

       file.close();

       System.out.println(content);

    }
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liu251/archive/2009/04/08/4057140.aspx

用Eclipse导出jar包,可能会遇到所用的图片怎么打不到jar中。http://www.talentdigger.cn/home/space.php?uid=4387&do=blog&id=16330

在使用mid文件时好像只能用文件流来处理,否则jar不能找到音乐文件

public void loadAndPlay(String str) {
   try {
    // From file
    //File midiFile = new File(PlayMidi.class.getResource(str).getFile());
    //jar包只能访问播放JAR文件中的声音文件一般是将声音文件处理成流的形式

    InputStream midiFile = this.getClass().getResourceAsStream(str);
    sequence = MidiSystem.getSequence(midiFile);
    Sequencer sequencer = MidiSystem.getSequencer();
    sequencer.open();
    sequencer.setSequence(sequence);   
    // Start playing
    sequencer.start();
   
   } catch (MalformedURLException e) {

   } catch (IOException e1) {

   } catch (MidiUnavailableException e2) {

   } catch (InvalidMidiDataException e3) {

   }
}

本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

posted @ 2009-08-26 19:27  莫忆往西  阅读(227)  评论(0)    收藏  举报