读取jar包所在目录和jar包内文件

        在网上查找了很多关于读取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

所以总得来说两种方法,按需选择采用那种方法。

            


版权声明:本文为galen_echo原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。