一个项目(guanli),有2个包(src、db),src中放着.java文件,db放的是数据,sre包中的.java程序如何获取到db包中的数据?如何获取项目里(非包内)的ico.jpg文件????
程序运行没有问题,但是打成.jar文件后就不能运行了,问题就是不能读取其他包的内容。
setIconImage( new ImageIcon( getClass().getResource("../Icon.jpg") ).getImage() );
import db.*;
getClass().getResource("db/a.txt");guanli
|
|__sre包
|
|__db包
|
|__ico.jpg (图像文件)
程序运行没有问题,但是打成.jar文件后就不能运行了,问题就是不能读取其他包的内容。
setIconImage( new ImageIcon( getClass().getResource("../Icon.jpg") ).getImage() );
import db.*;
getClass().getResource("db/a.txt");guanli
|
|__sre包
|
|__db包
|
|__ico.jpg (图像文件)
setIconImage( new ImageIcon( getClass().getResource("../Icon.jpg") ).getImage() ); 应该就可以读到了。
如果实在读不到,可以把jar导出后,再把图片文件放进去
在sre的包里面一个类里面执行以下代码:
File f = new File(Thread.currentThread().getContextClassLoader().getClass().getProtectionDomain().getCodeSource().getLocation().getFile());
注意:如果是使用的标准的或者规范的classLoader加载的类都会正确返回,否则有可能空指针
if (f.isDirectory()){
//说明为工程模式,未打包.此时f为 "工程目录/bin"
} else if (f.isFile()) {
//说明是jar包形式,f为sre包.
}此时就可以得到sre包的物理路径,然后找到db包fdb.
JarFile jar = new JarFile(fdb,false);
JarEntry entry = jar.getJarEntry("a.txt");
InputStream is = jar.getInputStream(entry)2.
try {
url = clazz.getResource(""); url = new URL(url.getFile().substring(0 , url.getFile().indexOf("!/")));
if (url != null) return url;
} catch(Exception e) {
url = null;
}
2 在jar里用如下的方法读取文件内容
读取 jar 里面的文件内容
少了个斜杠。
这个是我前一段研究自定义ClassLoader的成果,我忘了为什么最终选取这种方式了,但是确实是通用性最强的方式.