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

一:使用类路径

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

或者

 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包的目录。

使用

 int firstIndex = path.lastIndexOf(System.getProperty("path.separator")) + 1;
int lastIndex = path.lastIndexOf(File.separator) + 1;
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

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

加载的时候使用

 java.net.URL fileURL = this.getClass().getResource("/UI/image/background.jpg");
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类用来加载各种图片资源,那么可以如下使用

 public class ImageSource
{
static
{
URL fileURL = ImageSource.class.getResource(“/UI/image/background.jpg”);
BACK_GROUND = new ImageIcon(fileURL).getImage();
}
public static final Image BACK_GROUND;
}

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

Java如何获取当前的jar包路径以及如何读取jar包中的资源的更多相关文章

  1. java 动态获取web应用的部署路径

    public static String DEPLOY_PATH = null; static { String CurrentClassFilePath = Constant.class.getRe ...

  2. Spring boot框架项目,使用maven命令将配置文件打包到jar包外,项目运行读取jar外配置文件

    1.1      在eclipse中配置maven命令 Mvn -e clean package -Ptest -DskipTests=true 1.1.1    执行命令之后得到jar 1.2    ...

  3. Mac下 javac java 进行编译和运行含有包路径及引入jar包的类

    近两天因为刚入职,属于熟悉环境的阶段,研究了下算法(第四版),当不使用IDE工具直接使用终端进行javac 编译带有包的类,然后使用java 会出现如下错误提示: 使用谷歌搜索了很久,终于找到解决的办 ...

  4. JAVA 扫描指定路径下所有的jar包,并保存所有实现固定接口的类型

    private static Map<String, Object> loadAllJarFromAbsolute(String directoryPath) throws NoSuchM ...

  5. Java扫描classpath指定包路径下所有class

    在写框架时 经常需要扫描classpath指定包路径下带有某个Annotation的类,自己整理了一下 封装成一个工具类了,供大家参考. 源代码ClassPathResourceScanner.jav ...

  6. java war包 路径--解决war包中文件路径问题

    https://blog.csdn.net/u013409283/article/details/51480948 转自:http://free-chenwei.iteye.com/blog/1507 ...

  7. 【java】获取项目资源路径

    目资源路径分两种,一种是普通Java项目的资源路径,另一种是JavaEE项目的资源路径. 获取Java项目的包(源码下的包 或者 jar包)的资源路径 // 方法1:通过this.getClass() ...

  8. 全栈的自我修养: 0005 Java 包扫描实现和应用(Jar篇)

    全栈的自我修养: 0005 Java 包扫描实现和应用(Jar篇) It's not the altitude, it's the attitude. 决定一切的不是高度而是态度. Table of ...

  9. Java文件获取路径方式:

    转自:http://blog.csdn.net/appleprince88/article/details/11599805# 谢谢! 由于经常需要获取文件的路径,但是比较容易忘记,每次需要总需要查询 ...

随机推荐

  1. 谈谈一些有趣的CSS题目(六)-- 全兼容的多列均匀布局问题

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  2. C#调用C++的dll

    在类中添加引用 using System.Runtime.InteropServices; 在程序中写 //关闭连接 [DllImport("opapi2.dll", EntryP ...

  3. imfong.com,我的新博客地址

    imfong.com新博客采用jekyll+Github搭建,欢迎访问.

  4. JS中的集中页面跳转的方法

    第一种:    <script language="javascript" type="text/javascript">           wi ...

  5. js 中比较 undefined

    // x has not been declared before if (typeof x === 'undefined') { // evaluates to true without error ...

  6. 判断Python输入是否为数字

    在接收raw_input方法后,判断接收到的字符串是否为数字 例如: str = raw_input("please input the number:") if str.isdi ...

  7. eclipse 中 maven3 创建web项目

    一.创建项目 1.Eclipse中用Maven创建项目 上图中Next 2.继续Next 3.选maven-archetype-webapp后,next 4.填写相应的信息,Packaged是默认创建 ...

  8. Service Fabric SfDevCluster目录从默认的C盘移动

    管理员权限打开Powershell CD\ 回车 CD "C:\Program Files\Microsoft SDKs\Service Fabric\ClusterSetup" ...

  9. Redis详解(七)------ AOF 持久化

    上一篇文章我们介绍了Redis的RDB持久化,RDB 持久化存在一个缺点是一定时间内做一次备份,如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失).对于数据完整性要求很严 ...

  10. .Net EF Core数据库使用SQL server 2008 R2分页报错How to avoid the “Incorrect syntax near &#39;OFFSET&#39;. Invalid usage of the option NEXT in the FETCH statement.”

    一.  问题说明 最近.Net EF core 程序部署到服务器,服务器数据库安装的是SQL server 2008 R2,我本地用的的是SQL server 2014,在用到分页查询时报错如下: H ...