在网上查找了很多关于读取jar包的相对路径资料,但是大多都是读取jar包内文件的方法介绍,甚至有人将读取包内路径的方法混淆为读取包外路径的方法。经过本人亲自的测试,对于两种读取文件的方法有一点的总结。

1.读取jar包内文件

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

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

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

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

[java] view plaincopy
  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 plaincopy
  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

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

读取jar包所在目录和jar包内文件相关推荐

  1. linux启动jar后回到根目录,SpringBoot 打包 Jar 启动后,获得jar包所在目录,SpringBoot获取根目录...

    获取根目录五种方法 //第一种 File path = new File(ResourceUtils.getURL("classpath:").getPath()); if (!p ...

  2. System.getProperty(user.dir) 获取jar包所在目录

    /** 获得当前类的完整路径.最后一句 */ package org.outman.dms.server; import java.net.MalformedURLException; import  ...

  3. java 包和目录,Java中包和目录的区别

    In a Java Project, does keeping all the .java files in the same folder mean they are in the same pac ...

  4. Go 学习笔记(3)— 包概念、包特点、包名约束、main 包、包的声明、包的引用、包初始化

    1. 包的概念 Go 语言是使用包来组织源代码的,并实现命名空间的管理.任何源代码文件必须属于某个包.源码文件的第一行有效代码必须是 package pacakgeName 语句,通过该语句声明自己所 ...

  5. SpringBoot上传文件到本服务器 目录与jar包同级

    前言 看标题好像很简单的样子,但是针对使用jar包发布SpringBoot项目就不一样了. 当你使用tomcat发布项目的时候,上传文件存放会变得非常简单,因为你可以随意操作项目路径下的资源.但是当你 ...

  6. SpringBoot打成Jar包运行,获取运行Jar包的目录

    SpringBoot获取运行Jar包的目录 // linux和windows下通用 private String getJarFilePath() {ApplicationHome home = ne ...

  7. spring-boot引用资源:图片、json文件、模板目录(jar包运行依旧有效)

    spring-boot引用资源:图片.json文件.模板目录 前端时间,在idea上运行项目OK,但在打成jar包后运行却出了岔子.网上一番搜索,终于得到了解决:使用流,使用类路径 干货 图片,jso ...

  8. Java程序启动同时复制resources下文件到jar包同级目录

    Java代码调用.exe,包括获取exec()中的日志并打印,可以看我之前的博客 一.Java调用exe打包成jar的调用方式有俩种: Java程序中resources下的exe等文件,是可以同时打包 ...

  9. lib目录和maven dependency目录的jar包冲突

    用eclipse时新建项目时,会在lib目录下自动生成一些jar包,然后又在pom.xml文件中添加了依赖,导致lib下的jar包和maven dependency目录下的jar包产生了冲突.刚开始r ...

最新文章

  1. 无穷级数求和7个公式_考研数学闭关修炼习题讲解(16)无穷级数 附(6)补充解释
  2. zoj 3386 Trick or Treat 三分 求最大值的 最小值
  3. Ubuntu apt和dpkg命令用法
  4. webpack-plugin-webpack.DefinePlugin-应用全局变量,svn-rep-browser
  5. 离合器预减振超载造成变速箱怠速异响matlab与python仿真分析
  6. ubuntu网站收集
  7. springBoot 注入@Slf4j,框架中的方法无法调用。。。
  8. MariaDB基本操作--(创建用户)(转)
  9. ups维护服务器,UPS电源的在线维护和管理
  10. 2W+汉字转拼音JS字库(UTF-8生僻字等通用无乱码)
  11. GET data:image/jpg;base64,35,37,....... net::ERR_INVALID_URL
  12. 《关于动态社交网络建模和分析的教程》的读书笔记
  13. 小说APP源码,实现带下划线的密码输入框
  14. Redis持久化 - 邱乘屹的个人技术博客
  15. 【产品】蓝绿发布、滚动发布和灰度发布对比
  16. JButton:按钮组件
  17. linux添加ssh key
  18. Android~获取WiFi MAC地址和IP方法汇总
  19. python能参加奥赛吗-信息竞赛一定要python吗
  20. 在javascript中使用正则表达式来验证:E-Mail,账号,出生日期,姓名...

热门文章

  1. 程序员必备技能-科学砍需求 1
  2. C++ Primer 第二章 学习笔记及习题答案
  3. is present but cannot be translated into a null value due to being declared as a primitive type
  4. iOS_GET_网络请求
  5. Python之冒泡排序和选择排序的比较
  6. hive-jdbc/odbc的解读和看法
  7. 网络管理员考试案例梳理、真题透解与强化训练
  8. 戴尔BIOS 爆多个高危漏洞,影响Inspiron 等数百万系统
  9. 成都睿铂x云南省地矿测绘院:丽江玉龙高精度地籍免像控案例分享
  10. XP远程桌面连接强制登录