读取jar包内外文件

简介: 读取jar包内外文件

读取jar包中文件

概述

1、ClassLoader 是类加载器的抽象类。它可以在运行时动态的获取加载类的运行信息。 可以这样说,当我们调用ResourceJar.jar中的Resource类时,JVM加载进Resource类,并记录下Resource运行时信息(包括Resource所在jar包的路径信息)。而ClassLoader类中的方法可以帮助我们动态的获取这些信息:

         ● public URL getResource(String name)

           查找具有给定名称的资源。资源是可以通过类代码以与代码基无关的方式访问的一些数据(图像、声音、文本等)。并返回资源的URL对象。

         ● public InputStream getResourceAsStream(String name);

            返回读取指定资源的输入流。这个方法很重要,可以直接获得jar包中文件的内容。

       

2、ClassLoader是abstract的,不可能实例化对象,更加不可能通过ClassLoader调用上面两个方法。所以我们真正写代码的时候,是通过Class类中的getResource()和getResourceAsStream()方法,这两个方法会委托ClassLoader中的getResource()和getResourceAsStream()方法 。

若我们要访问项目中的资源文件,则一般使用相对路径或者用System.getProperities("user.dir")得到项目根目录,然后再访问资源文件,但是在将该工程和资源文件打包为jar包,运行该jar文件时,会显示找不到资源文件的错误。

解决方法:使用Class.getResource或者是ClassLoader.getResourceAsStream()将文件内容放到InputStream中,具体使用如下:

String s1 = this.getClass().getResource("/library.properties").getPath();

注意,使用class的getRescource时,要注意路径前要加"/",即根目录,此处的根目录是src

在使用ClassLoader时,路径前面不能加"/",使用相对路径。

@Test
    public void demo(){
        System.out.println(System.getProperty("user.dir"));
        String class_str2 = this.getClass().getResource("/logback-spring.xml").getPath();
        String classLoader_str = this.getClass().getClassLoader().getResource("logback-spring.xml").getPath();
        InputStream is =         this.getClass().getClassLoader().getResourceAsStream("logback-spring.xml");
        System.out.println(class_str2);
        System.out.println(classLoader_str);
        System.out.println(is == null );
    }
 
 
 
E:\idea_workspace\yanchang
/E:/idea_workspace/yanchang/target/classes/logback-spring.xml
/E:/idea_workspace/yanchang/target/classes/logback-spring.xml
false

 

读取jar外部文件

文件目录结构如下图

data里面放着我们要访问的数据,数据如下图所示

code.jar是可执行jar包,jar包中的代码欲访问data中的数据,那么我们可以在jar包中的任何类中编写一下代码即可访问与jar包同目录下的文件了

File file = new File(System.getProperty("user.dir") + "/data/a.txt");

System.getProperty("user.dir")执行结果在eclipse工程和jar包中是不一样

  • 在eclipse中,返回的是工程根目录(不是bin目录)即D:\code\test_project
  • 在命令行中运行jar包,返回的是jar包所在的目录,比如上面例子中就是返回D:\code


相关文章
|
15小时前
|
Java Docker 容器
|
15小时前
|
运维 Java Shell
Linux非常详细的shell运维脚本一键启动停止状态SpringBoot打成可运行jar包
Linux非常详细的shell运维脚本一键启动停止状态SpringBoot打成可运行jar包
36 0
|
15小时前
|
Java Maven 微服务
springboot项目开启远程调试-jar包
springboot项目开启远程调试-jar包
26 0
|
15小时前
|
Java Maven
向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录(一)
向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录
17 0
|
15小时前
|
Java Go Maven
向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录(二)
向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录
10 0
|
14小时前
|
前端开发 Java Linux
宝塔Linux:部署His医疗项目通过jar包的方式
宝塔Linux:部署His医疗项目通过jar包的方式
|
14小时前
|
安全 Java Docker
|
14小时前
|
Java
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
51 0
|
14小时前
|
Java Maven
springboot jar包启动提示没有主清单属性
springboot jar包启动提示没有主清单属性
|
14小时前
|
分布式计算 DataWorks Java
DataWorks产品使用合集之阿里云DataWorks专有云环境下,上传MaxCompute的UDF(用户自定义函数)的JAR包的步骤如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
22 0

热门文章

最新文章