如何读取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注册。

浙公网安备 33010602011771号