`

读取Jar包内的资源

阅读更多

在项目中使用Maven,有大量的jar包。
原来代码中 直接使用 Xxx.class.getResourceAsStream()方法来获取资源。
问题出现了,一旦classpath下或其它先加载jar包中出现相同的配置文件,那么就会优先读取这些文件

 

下面这个工具类可以帮助我们处理jar包内的资源

 

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Enumeration;

import com.zskx.pem.network.biz.commons.helper.file.FileReader;
import com.zskx.web.commons.action.BaseAction;

/**
 * Jar包相关工具
 * 
 * @author <a href="mailto:gaollg@sina.com">gaollg@sina.com</a>
 *
 */
public class JarUtils {

	/**
	 * 取得class所在 jar包名称
	 * 
	 * @param clazz 
	 * @return 返回值为null 表示直接在classpath下
	 */
	public static String getJarName(Class<?> jarClazz){
		String file = jarClazz.getProtectionDomain().getCodeSource().getLocation().getFile();
		if(file.endsWith(File.separator)){
			//就在classpath下
			return null;
		}
		return new File(file).getName();
	}
	
	/**
	 * 取得class所在 jar包 中的资源
	 * 
	 * @param jarClazz 
	 * @param resource 所取的资源
	 * @return
	 */
	public static URL getResourceFromJar(Class<?> jarClazz, String resource){
		if(resource.startsWith(File.separator)){
			resource = resource.substring(1);
		}
		
		URL classDir = jarClazz.getProtectionDomain().getCodeSource().getLocation();
		if(classDir.getPath().endsWith(File.separator)){
			//就在classpath下
			return jarClazz.getResource(resource);
		}
		//jar文件
		String path = classDir.toString();
		
        try {
			Enumeration<URL> res = jarClazz.getClassLoader().getResources(resource);
			while (res.hasMoreElements()) {
				URL url = res.nextElement();
				if(url.getPath().startsWith(path)){
					return url;
				}
			}
		} catch (IOException e) {
			//IO异常直接返回 null
			return null;
		}
		return null;
	}
	
	/**
	 * 取得class所在 jar包 中的资源
	 * 
	 * @param jarClazz 
	 * @param resource 所取的资源
	 * @return
	 */
    public static InputStream getResourceAsStreamFromJar(Class<?> jarClazz, String resource){
		URL url = getResourceFromJar(jarClazz, resource);
		try {
		    return url != null ? url.openStream() : null;
		} catch (IOException e) {
		    return null;
		}
    }
    
	/**
	 * 取得文件的所有文本内容 
	 * @param file
	 * @return
	 */
	public static String readAllText(InputStream in){
		StringBuffer sb = new StringBuffer();
		BufferedReader br = new BufferedReader(new InputStreamReader(in));
		try {
			String tempString = null;
			while ((tempString = br.readLine()) != null) {
				sb.append(tempString).append("\r\n");
            }
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally{
			if(in!=null){
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return sb.toString();
	}
	
	public static String readInputStream(Charset charset, InputStream in) {
		byte[] bytes = new byte[1024];
		int length = -1;
		ByteArrayOutputStream byteOutput= new ByteArrayOutputStream();
		try {
			while ((length = in.read(bytes)) != -1) {
				byteOutput.write(bytes, 0, length);
			}
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return new String(byteOutput.toByteArray(), charset);
	}
	
	public static String readResourceFromJar(Charset charset, Class<?> jarClazz, String resource) {
		InputStream in = getResourceAsStreamFromJar(jarClazz, resource);
		return readInputStream(charset, in);
	}
	
	public static String readResourceFromJar(Class<?> jarClazz, String resource) {
		return readResourceFromJar(Charset.forName("utf-8"), jarClazz, resource);
	}
	
	public static void main(String[] args) {
		//测试类 BaseAction在jar包中
		System.out.println(readResourceFromJar(BaseAction.class, "image.properties"));
		
	}
	
}

 

分享到:
评论

相关推荐

    Android的Jar包从主项目工程中读取并展示资源文件

    作为Android程序开发,我们自己在实际项目的开发过程中,经常会遇到我们打的Jar包需要动态的读取主项目工程中的资源文件,那么有没有一种好的方式,能够让Jar包非常方便的读取与展示主工程中的资源文件呢?...

    读取jar包中的图片,文本, 文本会写到控制台,图片会输出到F:盘中

    读取jar包中的图片,文本, 文本会写到控制台,图片会输出到F:盘中

    详解Java读取Jar中资源文件及示例代码

    主要介绍了详解Java读取Jar中资源文件及实现代码的相关资料,在开发java项目的时候,经常会用到jar包,这里就说下如何读取,需要的朋友可以参考下

    解决SpringBoot jar包中的文件读取问题实现

    主要介绍了解决SpringBoot jar包中的文件读取问题实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    spring boot加载第三方jar包的配置文件的方法

    本篇文章主要介绍了spring boot加载第三方jar包的配置文件的方法,详细的介绍了spring boot jar包配置文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    java_poi_读写word文件doc文档_含所有依赖jar包_demo

    java poi 读写word文件的Demo,内含所有依赖jar包,分享出来免资源分可下载。

    关于【python】【UDF】【HIVE】读取外部资源文件和第三方库的问题解决方案

    1.首先外部资源要在运行之前添加,使用命令add jar [jar file]或者add file [file]在hive中进行临时注册。 2.UDF中内部调用的文件地址直接用本地文件地址表示。例如: String filepath = “/home/dev/test/test.txt”...

    (2.0版本)自己写的struts2+hibernate+spring实例

    该项目使用的jar包为以下. spring-beans.jar xwork-2.0.4.jar spring-context.jar ognl-2.6.11.jar spring-web.jar spring-core.jar struts2-core-2.0.11.1.jar commons-logging-...

    APK解析(版本、包名、导出资源图片、证书相关信息、签名认证、权限、Activity等)

    本工具可以用于读取apk包的大量信息,无其他依赖。可以直接通过命令行运行,也可以当作架包使用。 命令行方式使用举例: 获取AndroidManifest.xml文件中定义的versionCode: java -jar ApkAnalysis.jar “apk路径” ...

    Java资源包01

    缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java...

    用SWT/JFace实现的资源管理器jExplorerV0.5(附源码)

    jar文件没有更新,如果需要打好包的jar文件请等我把功能都实现后的那个版本 - - &lt;br&gt; 尚未实现的功能: 1. 剪切/复制/粘贴功能 2. 拖拽功能 3. 详尽的注释 4. 异常处理 5. 国际化 &lt;br&gt; ...

    opinion-mining-system:新闻评论观点挖掘系统,粗粒度的分析出新闻网评观点的高度和趋势

    意见挖掘系统 新闻评论观点挖掘系统,粗粒度的分析出新闻网评观点的高度和趋势 系统的主要功能目标 给定一则新闻详情页,获取其中的...资源读取包,主要读取的是包含2w7千多个观点词的字典库。 工具。系统定义的工具

    java开源包2

    缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java...

    tengge手机端j2me编程教程完整版

    使用压缩包内资源 ┃6_8.文件夹各种操作 ┃6_9.文件各种操作 ┃第六章教程打包下载 ┗━━━━━━━━━━━ ┌第七章 j2me工具类使用 ┃7_1.随机数Random类的使用 ┃7_2.数学Math类的使用 ┃7_3.日期Date类的使用 ...

    JAVA上百实例源码以及开源项目

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。...

    java源码包2

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    HTTP分段下载/断点续传/多线程下载

    多线程就涉及到临界资源的访问问题,这里使用了Vector集合对象,另外,在必要的地方还使用了synchronized锁住共享对象; 3. 管道通信 为了不打乱第三方调用程序的处理逻辑,这里使用了管道通信技术,将内部下载...

    java源码包3

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    java源码包4

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

Global site tag (gtag.js) - Google Analytics