博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java如何获取当前的jar包路径以及如何读取jar包中的资源
阅读量:6933 次
发布时间:2019-06-27

本文共 1994 字,大约阅读时间需要 6 分钟。

hot3.png

写作业的时候要输出一个record.dat文件到jar包的同级目录,但是不知道怎么定位jar包的路径。百度到的方法不很靠谱,所以在这里记录一下。

一:使用类路径

1 String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();

或者

1 String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getFile();

因为程序已经被打包成jar包,所以getPath()和getFile()在这里的返回值是一样的。都是/xxx/xxx.jar这种形式。如果路径包含Unicode字符,还需要将路径转码

path = java.net.URLDecoder.decode(path, "UTF-8");

二:使用JVM

String path = System.getProperty("java.class.path");

利用了java运行时的系统属性来得到jar文件位置,也是/xxx/xxx.jar这种形式。

这样,我们就获得了jar包的位置,但是这还不够,我们需要的是jar包的目录。

使用

1 int firstIndex = path.lastIndexOf(System.getProperty("path.separator")) + 1;2 int lastIndex = path.lastIndexOf(File.separator) + 1;3 path = path.substring(firstIndex, lastIndex);

来得到目录。

path.separator在Windows系统下得到;(分号),在Linux下得到:(冒号)。也就是环境变量中常用来分割路径的两个符号,比如在Windows下我们经常设置环境变量PATH=xxxx\xxx;xxx\xxx;这里获得的就是这个分号。

File.separator则是/(斜杠)与\(反斜杠),Windows下是\(反斜杠),Linux下是/(斜杠)。

如何加载jar包中的资源。

1. 比如说我要得到背景图片,源代码中它是

/src/UI/image/background.jpg

那么在jar包中它的路径应该是

/UI/image/background.jpg

路径最前面的/表示根目录,即绝对路径,若没有最左边的/,则表示相对路径。使用哪种方法看自己的需求,这里使用了绝对路径。

加载的时候使用

1 java.net.URL fileURL = this.getClass().getResource("/UI/image/background.jpg");2 javax.swing.Image backGround = new ImageIcon(fileURL).getImage();

即可以获得该图片资源。

2. 有时候,我们需要加载文本资源或音乐资源,而文本在Java中是以流对象存在的,这时我们就要使用

InputStream in = this.getClass().getResourceAsStream("/UI/image/background.txt");

加载该资源。

PS:注意这里两种方法的区别,第一种是先得到该文件的路径,再加载该文件资源。第二种则是直接加载该对象。

3.有时候,我们有一些资源类,其中的资源对象都是pulic static final修饰的,这里可以采用这样的方法初始化。

比如说我有一个ImageSource类用来加载各种图片资源,那么可以如下使用

1 public class ImageSource2 {3     static4     {5         URL fileURL = ImageSource.class.getResource(“/UI/image/background.jpg”);6         BACK_GROUND = new ImageIcon(fileURL).getImage();7     }8     public static final Image BACK_GROUND;9 }

这里不能用构造函数初始化,因为构造函数和对象相关,而static变量和对象是无关的,只和类相关。在Java的语法中,类中的static块是不依赖类对象的,因此可以初始化statc对象。同时,static块中不能使用this,这里使用了ImageSource.class代替。

转载于:https://my.oschina.net/kanlianhui/blog/779740

你可能感兴趣的文章
C++ primer学习方法
查看>>
关于运维体系谈谈我的想法
查看>>
系统访问慢的几个原因
查看>>
mac git安装及github配置
查看>>
BZOJ2498 : Xavier is Learning to Count
查看>>
postgresql数据库的数据导出
查看>>
Kafka: Connect
查看>>
hibernate(七) hibernate中查询方式详解
查看>>
用gulp构建你的前端项目
查看>>
cmd for 循环拷贝文件
查看>>
【转】PHP date("Y-m-d H:i:s");获取当前时间 差8小时解决办法
查看>>
System.Security.Cryptography.CryptographicException,密钥集不存在
查看>>
敏捷团队中的QA由来
查看>>
gdb调试报错:Missing separate debuginfos, use: debuginfo-install glibc-XXX
查看>>
根据百度API获得经纬度,然后根据经纬度在获得城市信息
查看>>
mariadb 10.1查看per connection内存消耗
查看>>
重装MAC系统 “安装器有效负载签名检查失败” 解决方法
查看>>
(转) Supercharging Style Transfer
查看>>
JMeter性能测试,验证请求数据的准确性(wc命令)
查看>>
Python学习札记(二十三) 函数式编程4 sorted
查看>>