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

来源:互联网 发布:网购电影票软件 编辑:程序博客网 时间:2024/06/07 05:45
        在网上查找了很多关于读取jar包的相对路径资料,但是大多都是读取jar包内文件的方法介绍,甚至有人将读取包内路径的方法混淆为读取包外路径的方法。经过本人亲自的测试,对于两种读取文件的方法有一点的总结。

1.读取jar包内文件

        读取包内目录路径,通常都是用ClassLoader 是类加载器的抽象类。

        

[java] view plain copy
  1. this.getClass().getResourceAsStream("config.properties"); //返回的是一个InputStream  
  2. Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties")//返回的是一个InputStream  

        可以用上面的两种方法来实现读取jar包内的资源文件,可以再用一个。

        实际上,jar包内路径是跟我们平常的路径地址有一些区别。

[java] view plain copy
  1. package edu.hxraid;      
  2. import java.io.*;      
  3. import java.net.URL;      
  4. public class Resource {      
  5.     public  void getResource() throws IOException{        
  6.         //查找指定资源的URL,其中res.txt仍然开始的bin目录下       
  7.         URL fileURL=this.getClass().getResource("/resource/res.txt");       
  8.         System.out.println(fileURL.getFile());      
  9.     }      
  10.     public static void main(String[] args) throws IOException {      
  11.         Resource res=new Resource();      
  12.         res.getResource();      
  13.     }      
  14. }      


        当程序打包成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包所在的目录路径。

[java] view plain copy
  1. <span style="font-family:Microsoft YaHei;font-size:10px;">public void main(String arg[]){  
  2.         path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();  
  3.         path = path.substring(1,path.length());  
  4.         int endIndex = path.lastIndexOf("/");  
  5.         path = path.substring(0, endIndex);  
  6.         try {  
  7.             path = java.net.URLDecoder.decode(path, "utf-8");  
  8.         } catch (UnsupportedEncodingException e) {  
  9.             // TODO Auto-generated catch block  
  10.             e.printStackTrace();  
  11.         }  
  12.         System.out.println(path);  
  13. }  
  14. </span>  
方法二:使用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

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

            

原创粉丝点击