在项目中使用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包需要动态的读取主项目工程中的资源文件,那么有没有一种好的方式,能够让Jar包非常方便的读取与展示主工程中的资源文件呢?...
读取jar包中的图片,文本, 文本会写到控制台,图片会输出到F:盘中
主要介绍了详解Java读取Jar中资源文件及实现代码的相关资料,在开发java项目的时候,经常会用到jar包,这里就说下如何读取,需要的朋友可以参考下
主要介绍了解决SpringBoot jar包中的文件读取问题实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本篇文章主要介绍了spring boot加载第三方jar包的配置文件的方法,详细的介绍了spring boot jar包配置文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
java poi 读写word文件的Demo,内含所有依赖jar包,分享出来免资源分可下载。
1.首先外部资源要在运行之前添加,使用命令add jar [jar file]或者add file [file]在hive中进行临时注册。 2.UDF中内部调用的文件地址直接用本地文件地址表示。例如: String filepath = “/home/dev/test/test.txt”...
该项目使用的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包的大量信息,无其他依赖。可以直接通过命令行运行,也可以当作架包使用。 命令行方式使用举例: 获取AndroidManifest.xml文件中定义的versionCode: java -jar ApkAnalysis.jar “apk路径” ...
缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java...
jar文件没有更新,如果需要打好包的jar文件请等我把功能都实现后的那个版本 - - <br> 尚未实现的功能: 1. 剪切/复制/粘贴功能 2. 拖拽功能 3. 详尽的注释 4. 异常处理 5. 国际化 <br> ...
意见挖掘系统 新闻评论观点挖掘系统,粗粒度的分析出新闻网评观点的高度和趋势 系统的主要功能目标 给定一则新闻详情页,获取其中的...资源读取包,主要读取的是包含2w7千多个观点词的字典库。 工具。系统定义的工具
缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java...
使用压缩包内资源 ┃6_8.文件夹各种操作 ┃6_9.文件各种操作 ┃第六章教程打包下载 ┗━━━━━━━━━━━ ┌第七章 j2me工具类使用 ┃7_1.随机数Random类的使用 ┃7_2.数学Math类的使用 ┃7_3.日期Date类的使用 ...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...
多线程就涉及到临界资源的访问问题,这里使用了Vector集合对象,另外,在必要的地方还使用了synchronized锁住共享对象; 3. 管道通信 为了不打乱第三方调用程序的处理逻辑,这里使用了管道通信技术,将内部下载...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...