在网上查找了很多关于读取jar包的相对路径资料,但是大多都是读取jar包内文件的方法介绍,甚至有人将读取包内路径的方法混淆为读取包外路径的方法。经过本人亲自的测试,对于两种读取文件的方法有一点的总结。
1.读取jar包内文件
读取包内目录路径,通常都是用ClassLoader 是类加载器的抽象类。
this.getClass().getResourceAsStream("config.properties"); //返回的是一个InputStream
Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties")//返回的是一个InputStream
可以用上面的两种方法来实现读取jar包内的资源文件,可以再用一个。
实际上,jar包内路径是跟我们平常的路径地址有一些区别。
package edu.hxraid;
import java.io.*;
import java.net.URL;
public class Resource {
public void getResource() throws IOException{
//查找指定资源的URL,其中res.txt仍然开始的bin目录下
URL fileURL=this.getClass().getResource("/resource/res.txt");
System.out.println(fileURL.getFile());
}
public static void main(String[] args) throws IOException {
Resource res=new Resource();
res.getResource();
}
}
当程序打包成jar时执行上面代码会有下面的输出。
file:/C:/ResourceJar.jar!/resource/res.txt
2.读取jar包所在目录的路径
方法一:使用类路径
读取jar包的所在目录可以使用
String path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
但是使用这个方法如果有路径中包含中文,则需要使用 java.net.URLDecoder.decode(path, “UTF-8″) 方法进行转码,如下代码:读取jar包所在的目录路径。
public void main(String arg[]){
path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
path = path.substring(1,path.length());
int endIndex = path.lastIndexOf("/");
path = path.substring(0, endIndex);
try {
path = java.net.URLDecoder.decode(path, "utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(path);
}
方法二:使用JVM属性使用jvm属性读取jar包的所在目录可以使用
String path = System.getProperty("java.class.path")
但是这个方法虽然不需要做转码处理,但是当打包成jar时,
如果执行执行: java -jar e:/test.jar
输出是 e:/test.jar
如果先到jar包所在目录,在执行: java -jar test.jar
输出是 test.jar
所以总得来说两种方法,按需选择采用那种方法。