Java 获取文件Jar包中读取文件

2023-10-27

本文介绍java多种方式从classpath、url以及jar中读取文件。

各种路径获取方式

项目名:JavaPath
包名:com.theliang
说明:包下有一个 Main类,项目下有一个hello.text的文本文件

在这里插入图片描述


package com.theliang;

import java.io.File;
import java.io.InputStream;
import java.net.URL;

public class Main {

    public static void main(String[] args) throws Exception {
        //* 1. 获取项目的路径(非Jar包)
        String path1 = System.getProperty("user.dir");
        System.out.println("1.获取项目的路径 = " + path1);
        //* 1. 获取项目的主路径(包级以上级别)(非Jar包)
        String path1_1 = Main.class.getClassLoader().getResource(".").getFile();
        System.out.println("1.获取项目的路径 = " + path1_1);
        //* 2. 获取项目中当前类的路径(非Jar包)
        String path2 = Main.class.getResource("Main.class").getPath();
        System.out.println("2.获取项目中当前类的路径 = " + path2);
        //* 3. 获取Jar包所在路径
        String path3 = System.getProperty("user.dir");
        System.out.println("3.获取Jar包所在路径 = " + path3);
        //* 4. 获取Jar包路径
        String path4 = Main.class.getProtectionDomain().getCodeSource().getLocation().getFile();
        String path4_1 = Main.class.getProtectionDomain().getCodeSource().getLocation().getPath();//两个是相同的
        System.out.println("4.获取Jar包路径 = " + path4);
        System.out.println("4.获取Jar包路径 = " + path4_1);
        //* 5. 获取Jar包中指定资源的路径
        String path5 = Main.class.getClassLoader().getResource("hello.text").getPath();
        String path5_1 = Main.class.getClassLoader().getResource("hello.text").getFile();
        System.out.println("5.获取Jar包中指定资源的路径 = " + path5);
        System.out.println("5.获取Jar包中指定资源的路径 = " + path5_1);
        //* 6. 读取项目下的文件(非Jar包)
        URL url = Main.class.getClassLoader().getResource("hello.text");
        System.out.println("6.读取项目下的文件 = " + url.getPath());
        InputStream is = url.openStream();
//        is = Main.class.getClassLoader().getResourceAsStream("hello.text");//也可以写成这样
        byte[] bytes = new byte[1024];
        while (is.read(bytes) != -1) {
            System.out.println(new String(bytes, "UTF-8"));
        }

        //* 7. 读取Jar包中的文件(执行的类也在相同的jar包中)
        URL url2 = Main.class.getClassLoader().getResource("hello.text");
        System.out.println("7.读取Jar包中的文件 = " + url2.getPath());
        InputStream is2 = url2.openStream();
        byte[] bytes2 = new byte[1024];
        while (is2.read(bytes2) != -1) {
            System.out.println(new String(bytes2, "UTF-8"));
        }

        //* 8. 外部类访问Jar包内的文件
        String jarPath = "D:/Project/JavaPath/out/artifacts/JavaPath_jar/JavaPath.jar";
        URL url3 = new URL("jar:file:/" + jarPath + "!/hello.text");
        System.out.println("8.访问Jar包内的文件 = " + url3.getPath());
        InputStream is3 = url3.openStream();
        byte[] bytes3 = new byte[1024];
        while (is3.read(bytes3) != -1) {
            System.out.println(new String(bytes3, "UTF-8"));
        }

        //* 9. 乱码问题
        //如果路径包含Unicode字符,还需要将路径转码
        path1 = java.net.URLDecoder.decode(path1, "UTF-8");
    }
}

IDEA中输出的结果
1.获取项目的路径 = D:\Project\JavaPath
2.获取项目中当前类的路径 = /D:/Project/JavaPath/out/production/JavaPath/com/theliang/Main.class
3.获取Jar包所在路径 = D:\Project\JavaPath
4.获取Jar包路径 = /D:/Project/JavaPath/out/production/JavaPath/
4.获取Jar包路径 = /D:/Project/JavaPath/out/production/JavaPath/
5.获取Jar包中指定资源的路径 = /D:/Project/JavaPath/out/production/JavaPath/hello.text
5.获取Jar包中指定资源的路径 = /D:/Project/JavaPath/out/production/JavaPath/hello.text
6.读取项目下的文件 = /D:/Project/JavaPath/out/production/JavaPath/hello.text
Hello Test
测试文件
7.读取Jar包中的文件 = /D:/Project/JavaPath/out/production/JavaPath/hello.text
Hello Test
测试文件
8.访问Jar包内的文件 = file:/D:/Project/JavaPath/out/artifacts/JavaPath_jar/JavaPath.jar!/hello.text
Hello Test
测试文件

执行JAR包所输出的结果
1.获取项目的路径 = D:\Project\JavaPath\out\artifacts\JavaPath_jar
2.获取项目中当前类的路径 = file:/D:/Project/JavaPath/out/artifacts/JavaPath_jar/JavaPath.jar!/com/theliang/Main.class
3.获取Jar包所在路径 = D:\Project\JavaPath\out\artifacts\JavaPath_jar
4.获取Jar包路径 = /D:/Project/JavaPath/out/artifacts/JavaPath_jar/JavaPath.jar
4.获取Jar包路径 = /D:/Project/JavaPath/out/artifacts/JavaPath_jar/JavaPath.jar
5.获取Jar包中指定资源的路径 = file:/D:/Project/JavaPath/out/artifacts/JavaPath_jar/JavaPath.jar!/hello.text
5.获取Jar包中指定资源的路径 = file:/D:/Project/JavaPath/out/artifacts/JavaPath_jar/JavaPath.jar!/hello.text
6.读取项目下的文件 = file:/D:/Project/JavaPath/out/artifacts/JavaPath_jar/JavaPath.jar!/hello.text
Hello Test
测试文件
7.读取Jar包中的文件 = file:/D:/Project/JavaPath/out/artifacts/JavaPath_jar/JavaPath.jar!/hello.text
Hello Test
测试文件
8.访问Jar包内的文件 = file:/D:/Project/JavaPath/out/artifacts/JavaPath_jar/JavaPath.jar!/hello.text
Hello Test
测试文件

差异图:

在这里插入图片描述

外部类读取Jar包中的配置文件

Jar包中配置文件的路径格式是:jar:file/地址/Jar包.jar!/配置文件名

判断 是class文件执行还是jar文件执行

public class Main {
    public static void main(String[] args) {
        System.out.println(Main.class.getResource("Main.class").toString());
    }
}

在Class中会输出:

file:/D:/Project/JavaPath/out/production/JavaPath/com/theliang/Main.class

在Jar包中会输出:

jar:file:/D:/Project/JavaPath/out/production/JavaPath/com/theliang/JavaPath.jar!/com/theliang/Main.class

所以我们可以通过前缀判断执行环境

String filePath = Main.class.getResource("Main.class").toString();
// true: jar文件启动
// false: class文件启动
boolean road = filePath.startsWith("jar:file");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 获取文件Jar包中读取文件 的相关文章

随机推荐

  • 数据清洗和特征选择

    数据清洗和特征选择 数据清洗和特征挖掘的工作是在灰色框中框出的部分 即 数据清洗 gt 特征 标注数据生成 gt 模型学习 gt 模型应用 中的前两个步骤 灰色框中蓝色箭头对应的是离线处理部分 主要工作是 从原始数据 如文本 图像或者应用数
  • File格式转换MultipartFile格式的四种方式例子

    可以看到MultipartFile是个接口 转成MultipartFile格式则需要转成实现MultipartFile接口的实现类即可 如下选择转成用MockMultipartFile实现 首先 需要先引入依赖包
  • 链表常用函数总结

    创建单链表 PNODE creat list int len int i int val PNODE pHead NULL pHead PNODE malloc sizeof NODE if NULL pHead printf 分配内存失败
  • 电子计算机是采用什么进制法,计算机内部使用什么进制

    计算机内部采用二进制来表示信息 cpu的位是指一次性可处理的数据量是多少 1字节 8位 32位处理器可以一次性处理4个字节的数据量 也就是32位二进制 二进制是计算技术中广泛采用的一种数制 二进制数据是用0和1两个数码来表示的数 拓展资料
  • QT+OpenGL——GLFW编译配置

    环境 Qt5 8 0 VS2015 1 下载glfw源码 地址 https www glfw org download html 2 下载cmake工具 地址 http www cmake org cmake resources softw
  • Linux查看硬盘挂载

    目录 1 查看磁盘情况是否挂载上 2 在指定的硬盘上创建分区 3 设置开机自动挂载分区 1 查看磁盘情况是否挂载上 df h 该命令会显示出挂载磁盘和挂载点 下图分别是系统盘 以及挂载的一个硬盘 dev sda1 若某个磁盘没有挂载上 可以
  • WEBSHELL管理工具流量特征——基础篇

    前言 前一阵子帮别人做取证题目 有很多关于WEBSHELL的流量要分析 想起来还有没好好分析过于是准备写篇文章总结一下帮助大家能够快速的辨别WEBSHELL流量 下面我们展开文章来讲 中国菜刀 这个应该是大家最熟悉的WEBSHELL管理工具
  • 库存系统难破题?且看京东到家如何破

    京东到家库存系统架构设计 目前 京东到家库存系统经历两年多的线上考验与技术迭代 现服务着万级商家十万级店铺的规模 需求的变更与技术演进 我们是如何做到系统的稳定性与高可用呢 下面将会给你揭晓答案 库存系统技术架构图 上图如果进行总结下 主要
  • 《Windows server 2019操作系统》搭建各种服务器综合运用

    搭建域服务器 要求主域名为wgzj com IP地址为192 168 1 200 主机名为sever 搭建DNS服务器 并创建正向查找区域和反向查找区域 搭建FTP服务器 主目录为C wwwroot 搭建Web服务器 主目录为C wwwro
  • 单点登录的简单实现

    1 什么是单点登陆 单点登录 Single Sign On 简称为 SSO 是目前比较流行的企业业务整合的解决方案之一 SSO的定义是在多个应用系统中 用户只需要登录一次就可以访问所有相互信任的应用系统 较大的企业内部 一般都有很多的业务支
  • 机器学习——高斯朴素贝叶斯 Gaussian naive bayes

    问 高斯朴素贝叶斯假设离散特征的取值符合高斯分布 答 错误 高斯朴素贝叶斯假设连续特征的取值符合高斯分布 而不是离散特征 对于离散特征 通常使用多项式朴素贝叶斯或伯努利朴素贝叶斯进行分类 在 sklearn 库中 基于贝叶斯定理的算法集中在
  • win10 自带的远程桌面控制 ubuntu,不是补全

    win10 远程桌面控制ubuntu tab 不能补全 的解决方案 默认 tab 是窗口切换功能 方法有两个 在ubuntu中或者远程桌面中 编辑 config xfce4 xfconf xfce perchannel xml xfce4
  • TCP/IP详解学习笔记1

    为什么会有TCP IP协议 在世界上各地 各种各样的电脑运行着各自不同的操作系统为大家服务 这些电脑在表达同一种信息的时候所使用的方法是千差万别 就好像圣经中上帝打乱了各地人的口音 让他们无法合作一样 计算机使用者意识到 计算机只是单兵作战
  • mciSendString的介绍

    转载至 http blog sina com cn s blog 149e9d2ec0102wzcn html 使用MCI API 源文件中需要包含头文件Mmsystem h 在Project gt Settings gt Link gt
  • Windows 10 自带录制工具

    从知乎上学来的 Windows 10上自带的游戏录制工具 按Win G呼出 可录制游戏和任何一个桌面程序 可以截屏 不能控制录制的质量 录制出来的视频大小适中 只能录制一个程序 切换程序会导致录制停止 输出格式是mp4 视频编码H 264
  • sqlplus连接、登录命令大全(选择实例登录、连接远程数据库实例等等)

    1 默认实例登录 sqlplus username password 如 sqlplus tas yn tas yn 2 选择实例登录 sqlplus username password net service name 如 sqlplus
  • vue 获取微信定位经纬度,并调用高德地图解析出详细地址

    第一步 安装weixin js sdk 命令 npm i S weixin js sdk 或者 npm install weixin js sdk 第二步 在需要的地方引用 import wx from weixin js sdk 第三步
  • 《C和指针》笔记27:递归

    递归所需要的两个特性 存在限制条件 当符合这个条件时递归便不再继续 每次递归调用之后越来越接近这个限制条件 这里没有用计算阶乘和菲波那契数列的例子说明递归 作者指出前者递归并没有提供任何优越之处 而后者效率之低是非常恐怖的 下面程序的目的是
  • matlab中more_sols,薛定宇教授大讲堂(卷Ⅳ):MATLAB最优化计算最新章节_薛定宇著_掌阅小说网...

    2 4 联立方程组的精确求解 前面介绍过 利用图解方法只能求出给定方程的实数根 并不能求出方程的复数根 具体例子可以参见例2 12 另外 如果联立方程有多个实数根 则只能用图形方法绘制出根所在的位置 并不能直接得出根的具体值 需要逐个根进行
  • Java 获取文件Jar包中读取文件

    本文介绍java多种方式从classpath url以及jar中读取文件 文章目录 各种路径获取方式 IDEA中输出的结果 执行JAR包所输出的结果 外部类读取Jar包中的配置文件 判断 是class文件执行还是jar文件执行 各种路径获取