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

本文介绍了两种读取jar包路径的方法:一是读取jar包内部文件,利用类加载器获取资源;二是读取jar包所在目录路径,通过类路径或JVM属性实现。
        在网上查找了很多关于读取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

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

            

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值