java获取jar包中的文件资源

  • 一、问题示例
    • 1.1 项目开发时
    • 1.2 打包成jar后
  • 二、解决方案
    • 2.1 解决方法
    • 2.2 实现

问题描述:
  我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等)。在单独运行的时候这些简单的处理不会有问题。但是当我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。此时应该怎么办???

  我们在开发时,读取项目内的资源文件时,可以直接获取该资源文件在文件系统中的绝对路径。但是,一旦导出为jar包,就无法获取到资源文件的绝对路径。打完jar包以后资源(例如xml)等将被放在jar包下的第一层,这时使用上述路径就会错误,无法访问到资源。

一、问题示例

1.1 项目开发时


TestPath 文件内容:

package pro;
public class TestPath {public TestPath() {}public static String getFilePath(String fileName){return TestPath.class.getResource(fileName).getPath();}
}

主访问工程的main函数调用:

public static void main(String[] args) {String path = TestPath.getFilePath("data1.txt");System.out.println("path:"+path);File file = new File(path);if(file.exists() && file.isFile()){try {InputStream inputStream = new FileInputStream(file);System.out.println(inputStream);} catch (Exception e) {System.err.println("解析文件"+file.getName()+"异常:");e.printStackTrace();}}}

输出结果:

path:/D:/eclipse_powflow/workspace/TestPathPro/bin/pro/data1.txt
java.io.FileInputStream@6bc7c054

1.2 打包成jar后

打包成jar包,并在主工程中引用,如下:

再执行main函数,输出结果如下:

path:file:/D:/eclipse_powflow/workspace/Test/lib/TestPathPro.jar!/pro/data1.txt

  我们能够看到,此时的路径并不是文件资源定位符的格式 (jar中资源有其专门的URL形式: jar:!/{entry} )。所以,如果jar包中的类源代码用File f=new File(相对路径);的形式,是不可能定位到文件资源的。这也是为什么源代码打包成jar文件后,调用jar包时会报出FileNotFoundException的症结所在了。
  我们不能用常规操作文件的方法来读取ResourceJar.jar中的资源文件res.txt,但可以通过Class类的getResourceAsStream()方法来获取 ,这种方法是如何读取jar中的资源文件的,这一点对于我们来说是透明的。如下节所示。

二、解决方案

2.1 解决方法

  把资源打入jar包,无论资源文件在系统的什么路径下,jar包中的字节码程序都可以找到该包中的资源。我们可以用类装载器(ClassLoader)来做到这一点:

1、ClassLoader :
  是类加载器的抽象类。它可以在运行时动态的获取加载类的运行信息。 可以这样说,当我们调用.jar中的Resource类时,JVM加载进Resource类,并记录下Resource运行时信息(包括Resource所在jar包的路径信息)。而ClassLoader类中的方法可以帮助我们动态的获取这些信息:
2、public URL getResource(String name):
  查找具有给定名称的资源。资源是可以通过类代码以与代码基无关的方式访问的一些数据(图像、声音、文本等)。并返回资源的URL对象。
3、public InputStream getResourceAsStream(String name):
  返回读取指定资源的输入流。这个方法很重要,可以直接获得jar包中文件的内容。

2.2 实现

1、在TestPath工具类中使用getClassLoader().getResourceAsStream获取资源流数据:

/**增加函数,替换getFilePath()函数,直接获取资源流数据*/
public static InputStream getFileInputStream(String fileName){return TestPath.class.getClassLoader().getResourceAsStream(fileName);}

注意:fileName如果是xml文件等,直接写文件名即可,例如原来是src/main/xxx.xml,现在直接写main/xxx.xml(src的下级目录)

2、测试打印内容:
主访问工程的main函数调用:

public static void main(String[] args) {try {InputStream fileIn = TestPath.getFileInputStream("pro/data1.txt");BufferedReader reader = new BufferedReader(new InputStreamReader(fileIn, StandardCharsets.UTF_8));String s = "";while ((s=reader.readLine())!=null) {System.out.println(s);}} catch (IOException e) {e.printStackTrace();}}

输出结果:

java获取jar包中的文件资源相关推荐

  1. 在swt中获取jar包中的文件 uri is not hierarchical

    uri is not hierarchical 学习了:http://blog.csdn.net/zdsdiablo/article/details/1519719 在swt中获取jar包中的文件: ...

  2. 获取jar包中的文件,及遍历jar包中的文件

    获取jar包中的文件 ClassPathResource resource1 = new ClassPathResource("文件夹" + File.separator + &q ...

  3. java 读取jar包中的文件

    文章目录 项目resource中文件路径和jar包中文件路径的区别 正常读取 jar包读取 完整代码: 项目resource中文件路径和jar包中文件路径的区别 打成jar包后,是一个整体的文件. 正 ...

  4. android jar 加入图片,Android动态加载外部jar包及jar包中图片等资源文件

    Android动态加载外部jar包及jar包中图片等资源文件 Android应用程序由Java开发,因此Java中许多实用的特性,在Android中也有体现.动态加载Class,也就是外部jar包,在 ...

  5. 打包部署后无法读取jar包里的文件(实测可行,Java中读取jar包中的文件)

    打包部署后无法读取jar包里的文件 Java中读取jar包中的文件 linux中无法读取jar包中的内容(windows可以的!),如何解决 一.背景 项目中免不了需要读取文件,如果文件用绝对路径读取 ...

  6. java执行jar中的main_浅谈java 执行jar包中的main方法

    浅谈java 执行jar包中的main方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar 执行后总是运行指定的主方法,如果 jar 中有多个 ...

  7. 使用jar命令替换jar包中指定文件

    一.jar命令用法 -c 创建新的归档文件-t 列出归档目录和文件-x 解压缩已归档的指定(或所有)文件-u 更新现有的归档文件-v 在标准输出中生成详细输出 / 提供更详细输出信息-f 指定归档文件 ...

  8. java从jar包中拷贝资源文件到临时文件夹

    具体方法: /*** 拷贝资源问件** @param path*/public static void extract(String path) {try {//创建临时文件夹File tempDir ...

  9. jd+jbe修改jar包中class文件

    有时候从网上下的java demo中,有的是发布后的环境,所以只有jar包信息,没有对应的源码,我们要把其中的信息修改下,所以就需要我们本文中提到的直接修改java class信息.参考网上资料好,赶 ...

最新文章

  1. 自己制作 Windows Server 2008中文版
  2. 初识IBM刀片服务器
  3. c语言u64数据类型打印,小谈C语言中常见数据类型在32及64位机上的使用
  4. nginx 配置两个域名
  5. Dubbo和Spring Cloud微服务架构
  6. windows xp安装php7,在Windows XP下安装Apache+MySQL+PHP环境
  7. 解决 Windows Update 时提示当前无法检查更新,因为未运行服务
  8. 2020蓝桥杯省赛---java---B---8(数字三角形)
  9. java 两个数组交叉_java – 如何交叉两个没有重复的排序整数数组?
  10. HDU多校联合赛(1007 Magical Forest)模拟题
  11. JVM学习-类文件结构
  12. 《21天学通C语言(第7版)》一2.4 小 结
  13. Unity获取时间戳
  14. 中心极限定理 central limit theorem
  15. 今年本人英语六级分数剖析
  16. 2021边缘保研经历(整个大三),川大 - 浙大软院
  17. 用友U8V系统怎么重启服务器,用友u8怎么重启云服务器
  18. 3d Max安装失败(Microsoft Visual C++ 2010 SP1 Redistributable (x86) Failed...
  19. 气压传感器c语言程序,气压芯片参数——以气压传感器芯片DSH553为例
  20. XiaoMi-Ruby-15.6-UMA-only黑苹果efi引导文件

热门文章

  1. RateLimit:限流
  2. 什么是LPWAN?同为LPWAN技术标准,ZETA是国产lora技术吗?
  3. 创业如同追女生:成功的创业者都是追女生好手
  4. JAVA思维导图复习策略
  5. 如何搭建个人云盘?(支持WebDav):Cloudreve+阿里云+宝塔面板(详细教程)
  6. angular阻止事件冒泡
  7. 安装应用提示与已安装应用签名不同
  8. 模仿天猫图片放大demo
  9. Ansible的配置文件
  10. 中国薪酬发展报告(2011年)