从jar包中读取文件的几种方式

2023-05-16

写在前面

本文会用到这篇文章。

1:从自身读取文件

1.1:定义读取的文件

在这里插入图片描述

1.2:读取代码

@SpringBootApplication
public class HelloWorldMainApplication {

    public static void main(String[] args) throws URISyntaxException, IOException {
        // fileName是在当前类路径中的一个文件
        InputStream in = HelloWorldMainApplication.class.getResourceAsStream("../../myfile.txt");
        if (null != in) {
            File file = new File("D:\\test\\myfile.txt");
            file.delete();
            file.createNewFile();
            OutputStream out = new FileOutputStream(file);
            byte[] bytes = new byte[1];
            while (in.read(bytes) != -1) {
                out.write(bytes);
            }
            out.flush();
        }
        SpringApplication.run(HelloWorldMainApplication.class, args);
        System.exit(0);
    }

}

1.3:package打jar

参考这篇文章。

1.4:运行

在这里插入图片描述

1.5:查看生成文件

在这里插入图片描述

2:获取当前jar所在的路径

2.1:测试代码

@SpringBootApplication
public class HelloWorldMainApplication {

    public static void main(String[] args) throws URISyntaxException, IOException {
        String path;
        URL url = HelloWorldMainApplication.class.getProtectionDomain().getCodeSource().getLocation();
        URLConnection connection = url.openConnection();
        if(connection instanceof JarURLConnection) {
            JarFile jarFile = ((JarURLConnection) connection).getJarFile();
            path = jarFile.getName();
            int separator = path.indexOf("!/");
            if (separator > 0) {
                path = path.substring(0, separator);
            }
        } else {
            path = url.getPath();
        }
        System.out.println("当前jar物理路径是:" + path);

        SpringApplication.run(HelloWorldMainApplication.class, args);
        System.exit(0);
    }

}

2.2:package打jar

参考这篇文章。

2.3:运行

在这里插入图片描述

3:获取其他jar中的文件

3.1:测试的jar

在这里插入图片描述
自己随便找一个jar就可以进行后续测试,这里只是贴下我使用的jar,方便和输出做对比。

3.2:测试程序

public static void main(String[] args) throws Exception {
    JarFile jarFile = new JarFile("d:\\test\\cglib-2.1.95.jar");
    Enumeration<JarEntry> entries = jarFile.entries();
    while (entries.hasMoreElements()) {
        JarEntry jarEntry = entries.nextElement();
        InputStream inputStream = jarFile.getInputStream(jarEntry);
        System.out.println("名称:" + jarEntry.getName() + " ,流对象: " + inputStream + ",大小:" + inputStream.available());
    }
}

运行结果:

名称:META-INF/ ,流对象: java.util.zip.ZipFile$ZipFileInputStream@372f7a8d,大小:0
名称:META-INF/MANIFEST.MF ,流对象: java.util.zip.ZipFile$ZipFileInflaterInputStream@2f92e0f4,大小:1401
...snip...
名称:META-INF/maven/org.glassfish.hk2.external/cglib/ ,流对象: java.util.zip.ZipFile$ZipFileInputStream@452b3a41,大小:0
名称:LICENSE ,流对象: java.util.zip.ZipFile$ZipFileInflaterInputStream@4a574795,大小:11357
名称:net/sf/cglib/util/ParallelSorter$IntComparer.class ,流对象: java.util.zip.ZipFile$ZipFileInflaterInputStream@f6f4d33,大小:648
...snip...
名称:net/sf/cglib/util/ParallelSorter.class ,流对象: java.util.zip.ZipFile$ZipFileInflaterInputStream@65b54208,大小:4269

4:通用方式(建议这种!!!)

假设在classpath有如下的文件:
在这里插入图片描述
通过如下的代码,不管是直接运行,还是可执行jar包运行都可以读取到:

@SpringBootApplication
public class HelloWorldMainApplication {

    public static void main(String[] args) throws Exception {
        ClassLoader classLoader = HelloWorldMainApplication.class.getClassLoader();
        URL resource = classLoader.getResource("aaa/bb/dddd.txt");
        System.out.println("路径是:" + resource.getPath());
        BufferedReader reader = new BufferedReader(new InputStreamReader(resource.openStream(), "utf-8"));
        String line;
        String result = "";
        while ((line = reader.readLine()) != null) {
            result += line;
        }
        System.out.println("内容是:" + result);
        SpringApplication.run(HelloWorldMainApplication.class, args);
    }
}

如下是我本地直接运行和可执行jar运行的结果:
在这里插入图片描述在这里插入图片描述
也可以从其他jar中读取文件,比如读取如下的文件:
在这里插入图片描述
程序如下:

@SpringBootApplication
public class HelloWorldMainApplication {

    public static void main(String[] args) throws Exception {
        ClassLoader classLoader = HelloWorldMainApplication.class.getClassLoader();
//        URL resource = classLoader.getResource("aaa/bb/dddd.txt");
        URL resource = classLoader.getResource("META-INF/spring.factories");
        System.out.println("路径是:" + resource.getPath());
        BufferedReader reader = new BufferedReader(new InputStreamReader(resource.openStream(), "utf-8"));
        String line;
        String result = "";
        while ((line = reader.readLine()) != null) {
            result += line;
        }
        System.out.println("内容是:" + result);


        SpringApplication.run(HelloWorldMainApplication.class, args);
    }
}

朋友们自己试下。如果是在本地的resource下也有META-INF/spring.factories,如下图:
在这里插入图片描述
也可以通过如下代码同时读取多个:

@SpringBootApplication
public class HelloWorldMainApplication {

    public static void main(String[] args) throws Exception {
        ClassLoader classLoader = HelloWorldMainApplication.class.getClassLoader();
//        URL resource = classLoader.getResource("aaa/bb/dddd.txt");
        Enumeration<URL> resources = classLoader.getResources("META-INF/spring.factories");
        while (resources.hasMoreElements()) {
            URL resource = resources.nextElement();
            System.out.println("路径是:" + resource.getPath());
            BufferedReader reader = new BufferedReader(new InputStreamReader(resource.openStream(), "utf-8"));
            String line;
            String result = "";
            while ((line = reader.readLine()) != null) {
                result += line;
            }
            System.out.println("内容是:" + result);
        }

        SpringApplication.run(HelloWorldMainApplication.class, args);
    }
}

输出如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从jar包中读取文件的几种方式 的相关文章

随机推荐

  • Angular-使用ng update命令升级到Angular7.1.4

    Angular 使用ng update命令升级到Angular7 1 4 Angular CLI 是 Angular 的一个命令行工具 xff0c 可以便捷的执行创建项目 创建文件 测试 打包和发布等任务 关于 Angular 版本 Ang
  • 程序设计作业week04

    A DDL 的恐惧 题目 ZJM 有 n 个作业 xff0c 每个作业都有自己的 DDL xff0c 如果 ZJM 没有在 DDL 前做完这个作业 xff0c 那么老师会扣掉这个作业的全部平时分 所以 ZJM 想知道如何安排做作业的顺序 x
  • STM32平台下官方DMP库6.12超详细移植教程

    前记 Motion Driver官方库 xff1a Motion Driver 6 12 STM32工程源码 xff1a STM32F103C8 软件MPU6050 xff08 DMP xff09 MPU6050软件I2C驱动 xff0c
  • 嵌入式Linux系统开发笔记(十四)

    U Boot环境变量 uboot 中有两个非常重要的环境变量 bootcmd 和 bootargs xff0c bootcmd 和 bootagrs 是采用类似 shell 脚本语言编写的 xff0c 里面有很多的变量引用 xff0c 这些
  • 嵌入式Linux系统开发笔记(十五)

    Linux内核启动验证 5 1 编译内核 span class token comment 清除工程 span span class token comment make distclean span span class token co
  • 嵌入式Linux系统开发笔记(十六)

    根文件系统rootfs启动验证测试 接下来我们使用测试一下前面创建好的根文件系统 rootfs xff0c 测试方法使用 NFS 挂载 6 1 检查是否在Ubuntu主机中安装和开启了NFS服务 xff08 特别注意 xff1a nfs 配
  • 安卓5.0以上7.0以下使用Termux

    参考 xff1a https zhuanlan zhihu com p 400507701 说明 xff1a Termux支持5 0以上的安卓系统 Termux7 3版本之后 xff0c 仅支持7 0以上的安卓系统 1 安装Termux 设
  • 关于DSP的CCS6.0平台下的工程搭建(完全可移植)

    本工程以CCS6 0下新建TMS320F28335工程为例 xff0c 其他系列处理器工程搭建类似 xff0c 参考本例即可 工程搭建用到的F2833x TI官方库文件 下载链接 也可直接参考笔者搭建好CCS6 0的工程 下载链接 所建工程
  • STM32Fxx JTAG/SWD复用功能重映射

    问题描述 xff1a 在实验室调车过程中 xff0c 遇到的一个问题 xff1a 为了每次下载程序方便 xff0c 队员们往往会把 Jlink 插在板子上 xff0c 可是在调车过程中发现 xff0c 有时程序会莫名死掉 xff0c 而同样
  • VS2012编译RTKLIB——GNSS定位开源库

    RTKLIB 开源库 有着强大的 GPS 数据实时和后处理功能 xff0c 由于 笔者的毕业设计中需要对GPS 载波相位观测量进行 RTK 解算 xff0c 故而 xff0c 对 RTKLIB 开源库进行了学习与研究 RTKLIB 提供了很
  • 51单片机串行口波特率计算

    1 工作方式介绍 xff1a 方式 0 xff1a 这种工作方式比较特殊 xff0c 与常见的微型计算机的串行口不同 xff0c 它又叫 同步移位寄存器输出方式 在这种方式下 xff0c 数据从 RXD 端串行输出或输入 xff0c 同步信
  • 解决HTTPS证书安全检测时提示 PCI DSS 不合规问题

    解决HTTPS证书安全检测时提示 PCI DSS 不合规问题 今天在进行HTTPS证书安全检测时 xff0c 提示PCI DSS不合规 经查询得知是因为SSL配置时启用了TLS1 0导致的 关于 PCI DSS 自2018年6月30日起 x
  • 数码管显示问题总结

    1 数码管显示原理 我们最常用的是七段式和八段式 LED 数码管 xff0c 八段比七段多了一个小数点 xff0c 其他的基本相同 所谓的八段就是指数码管里有八个小 LED 发光二极管 xff0c 通过控制不同的 LED 的亮灭来显示出不同
  • 多种方式登陆模块设计

    多种方式登陆模块设计 目录 多种方式登陆模块设计 目录参考了一些资料总结一下 1 使用 用户名邮箱手机号 密码 登陆2 第三方登陆 mob文档中还有以下描述 思考 参考了一些资料 知乎 第三方一键登录如何保证产品的唯一ID xff1f 开源
  • P1233 木棍加工

    题目描述 一堆木头棍子共有n根 xff0c 每根棍子的长度和宽度都是已知的 棍子可以被一台机器一个接一个地加工 机器处理一根棍子之前需要准备时间 准备时间是这样定义的 xff1a 第一根棍子的准备时间为1分钟 xff1b 如果刚处理完长度为
  • RUST 是 JavaScript 基建的未来

    这里写自定义目录标题 1 RUST 是 JavaScript 基建的未来1 1 Rust 是什么 1 2 Adoption1 3 从 JavaScript 到 Rust1 4 SWC1 5 Deno1 6 esbuild1 7 Rome1
  • VNC XRDP

    2个可以远程到linux上的远程桌面 xff0c 我都在我的raspi2上实现了 xff0c 这2个软件在我看来都差不多 xff0c 都可以满足我的要求 xff0c 只不过一个需要在windows上安装客户端VNC VIEWER xff0c
  • [Python学习]基础一: 循环

    34 if 语句可以嵌套 xff0c 但是不推荐 2 xff09 python 没有switch语句 3 xff09 循环语句 重复的执行某一个固定的动作或者任务 分类for while 4 xff09 for循环 for 变量 in 序列
  • springboot配置mysql数据库spring.datasource.url报错处理

    spring datasource url 61 jdbc mysql abc 3306 abcd useUnicode 61 true amp characterEncoding 61 utf8 很常规地配置了这个mysql的url后发现
  • 从jar包中读取文件的几种方式

    写在前面 本文会用到这篇文章 1 xff1a 从自身读取文件 1 1 xff1a 定义读取的文件 1 2 xff1a 读取代码 span class token annotation punctuation 64 SpringBootApp