详解Java读取Jar中资源文件及示例代码
作者:lqh 发布时间:2021-07-12 11:18:52
标签:java,jar,资源
详解Java读取Jar中资源文件及实现代码
直接上代码,文章的注释部分说的比较清楚,大家可以参考下,
工具类源代码: ResourceLoadFromJarUtil.java
实现代码:
import java.io.IOException;
import java.io.InputStream;
import java.net.JarURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import org.apache.commons.io.IOUtils;
public class ResourceLoadFromJarUtil {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
/* 资源文件路径,不能以'/'字符字符开头 */
String resourcePath = "struts-plugin.xml";
/* 获取ClassPath下的所有jar路径 */
String[] cps = System.getProperty("java.class.path").split(";");
/* 读取本地Jar文件 */
for (String cp : cps) {
if (!cp.endsWith(".jar")) {
continue;
}
InputStream in = loadResourceFromJarFile(cp, resourcePath);
if (in != null) {
System.err.println(IOUtils.toString(in));
in.close();
}
}
/* 读取本地Jar文件 */
for (String cp : cps) {
if (!cp.endsWith(".jar")) {
continue;
}
InputStream in = loadResourceFromJarURL(cp, resourcePath);
if (in != null) {
System.err.println(IOUtils.toString(in));
in.close();
}
}
/* 读取网络Jar文件 */
InputStream in = loadResourceFromJarURL(
"http://localhost:8080/SpringStruts2Integration/struts2-spring-plugin-2.3.4.1.jar", resourcePath);
if (in != null) {
System.err.println(IOUtils.toString(in));
in.close();
}
}
/**
* 读取Jar文件中的资源
*
* @param jarPath
* 本地jar文件路径
* @param resPath
* 资源文件所在jar中的路径(不能以'/'字符开头)
* @return 如果资源加载失败,返回null
*/
public static InputStream loadResourceFromJarFile(String jarPath, String resPath) {
if (!jarPath.endsWith(".jar")) {
return null;
}
try {
JarFile jarFile = new JarFile(jarPath);
JarEntry jarEntry = jarFile.getJarEntry(resPath);
if (jarEntry == null) {
return null;
}
return jarFile.getInputStream(jarEntry);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* 读取Jar文件中的资源
*
* @param jarUrl
* 本地jar文件或网络上(ttp://host:port/subpath/jarfile.jar)jar文件路径
* @param resPath
* 资源文件所在jar中的路径(不能以'/'字符开头)
* @return 如果资源加载失败,返回null
*/
public static InputStream loadResourceFromJarURL(String jarUrl, String resPath) {
if (!jarUrl.endsWith(".jar")) {
return null;
}
URL url = null;
if (jarUrl.startsWith("http://")) {
try {
url = new URL("jar:" + jarUrl + "!/");
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
}
} else {
try {
url = new URL("jar:file:/" + jarUrl + "!/");
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
}
}
try {
JarURLConnection jarURLConnection;
jarURLConnection = (JarURLConnection) url.openConnection();
JarFile jarFile = jarURLConnection.getJarFile();
JarEntry jarEntry = jarFile.getJarEntry(resPath);
if (jarEntry == null) {
return null;
}
return jarFile.getInputStream(jarEntry);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
来源:http://feticoolo.iteye.com/blog/1696331


猜你喜欢
- 一、本文来由由于网络不稳定的原因,所以想着启动本地nacos来运行项目,但是nacos启动没问题了,但是依旧报错。Caused by: co
- REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系
- Android本地存储SharedPreferences详解存储位置SharedPreferences数据保存在: /data /data/
- @RequestBody配合@Valid校验入参参数自定义一个Controllerimport com.example.demo.pojo.
- 前言:在Java面试中,线程的状态也是被经常考察的知识点,今天我们就来聊一聊线程状态的那些事!线程在JVM中的状态查看线程在JVM中有哪些不
- 正在编译...1>Ipv4IPv6traceroutesrc.cpp1>d:\研究生\c++\study\test\test\i
- 前言:本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。一.最常见方式(未必最
- 我们知道java程序是运行在JVM中的,而JVM就是构建在内存上的虚拟机,那么内存模型JMM是做什么用的呢?我们考虑一个简单的赋值问题:in
- feign调用服务时参数内容过大场景前端参数传入到gateway后,gateway使用feign调用服务时,传入的参数内容过大(参数常见于富
- Android短信高效备份这篇文章,承接上一篇。使用高效的方式备份短信——xml序列化器。存储短信,要以对象的方式存储。首先创建javabe
- 很多时候忘记Android摄像头如何打开,查看google文档的话,发现太复杂(只是单纯的想打开摄像头而已,不想添加那么多设置,添加那么功能
- 今天的几个目标: 1. 自定义ActionProvider 2. Toolbar ActionBar自定义Menu 3. Toolbar A
- 一、简介二、代码/activityLifeCycle_3Screen/AndroidManifest.xml<manifest xml
- 前面已经把java io的主要操作讲完了 这一节我们来说说关于java io的其他内容 Serializable序列化 实例1:对象的序列化
- 前言ps命令的作用是显示进程信息的。|符号,是个管道符号,表示左右两边两个命令同时执行。grep命令是查找(Global Regular E
- 基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后
- 目录概述事件监听的结构Publisher,Event和Listener的关系事件发布者监听者总结概述ApplicationEvent以及Li
- List 是在开发中比较常用的集合,今天总结一下 Java 中初始化 List 的几种方式。1、常规方式List<String>
- 本文实例讲述了android开发之listView组件用法。分享给大家供大家参考,具体如下:关于Android ListView组件中and
- File存储(内部存储)一旦程序在设备安装后,data/data/包名/ 即为内部存储空间,对外保密。Context提供了2个方法来打开输入