`
zhangcong170
  • 浏览: 69672 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

jar包中读取资源文件

    博客分类:
  • j2ee
阅读更多

      今天写代码的时候发现一个有趣的问题,就是在代码中读取一些资源文件(txt,gif等等)时候,单独运行的时候,当然没问题,但是当我们将项目打包成jar后,尽管资源文件在jar包内,但我们却怎么也访问不到它了。

代码结构如下:

src|---com
                ---cn
                       ---ChineseUtil.java
src|---pinyin.txt

 ChineseUtil.java

package com.cn;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;

public class ChineseUtil {
	private Properties properties;

	public ChineseUtil() {
		this.properties=loadProperties("pinyin.txt");
	}

	
	/**
	 * 加载资源文件
	 * @param file
	 * @return
	 */
	private Properties loadProperties(String file) {
		Properties p = new Properties();
		URL url=this.getClass().getResource("/"+file);
		System.out.println(url.getPath());//输出文件路径
		try {
			p.load(new FileInputStream(url.getFile()));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return p;
	}	
}

 在本工程下,测试代码如下:

public class PinyinTest {
	public static void main(String[] args) {
         ChineseUtil util=new ChineseUtil();
	}
}

 测试一切正常,没有抛出异常,但是当我们将该项目打包成jar,新建一个java工程,并仍然采用上面的java代码进行测试时,却发现代码抛出异常:

file:/D:/frame/pinyin.jar!/pinyin.txt
java.io.FileNotFoundException: file:\D:\frame\pinyin.jar!\pinyin.txt (文件名、目录名或卷标语法不正确。)

 

 抛出异常了,找不到资源文件了!让我们注意一下输出的文件的路径,file:\D:\frame\pinyin.jar!\pinyin.txt,和一般的文件路径相比,多了一个!,你不仔细观察,是看不出来的!查阅了相关资料,原来jar包中文件URL有专用格式的:jar:<url>!/{entry},而我们是不能以这种形式来new一个File的,那该怎么做呢,我们把 loadProperties方法修改如下:

 

 

private Properties loadProperties(String file) {
		Properties p = new Properties();
		//注意加载资源文件的写法  /表示从根目录开始  否则就表示从当前类所在的路径下开始
		InputStream is=this.getClass().getResourceAsStream("/"+file);  
		try {
			p.load(is);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return p;
	}

 即通过通过Class类的getResourceAsStream()方法来获取文件,这个方法是透明的,你可以像普通的File一样去定位jar包中的资源文件(不管你是jar文件还是普通的文件夹)。另外还有一个比较让人纠结的方式是使用java.util.jar.JarFile类才访问,不过使用起来非常的不习惯,具体大家可以参考API试试。

PS:接下来该看看底层是怎么实现了,有经验的朋友不妨说说

 

 

 

分享到:
评论
11 楼 zhangcong170 2010-12-26  
angel243fly 写道
资源文件必须打进jar包吗?如果不是必须的话,那就可以放在工程中直接实用

我只是在试验   比如像struts2之类的  本身也带了资源文件  就想看看试试它们是怎么做的
10 楼 angel243fly 2010-12-26  
资源文件必须打进jar包吗?如果不是必须的话,那就可以放在工程中直接实用
9 楼 lfrick 2010-12-25  
生成jar文件的时候,勾上Add directory entries
8 楼 zhangcong170 2010-12-25  
yunchow 写道
this.getClass().getResourceAsStream("/"+file); 

这种方法是有缺陷的,JRE会对读入的文件进行缓存,应用启动后,无法刷新

那应该怎么处理呢?请指教  谢谢
7 楼 mp_juan 2010-12-25  
Thread.currentThread.getClassLoader().getResourceAsStream(file);
6 楼 yunchow 2010-12-25  
this.getClass().getResourceAsStream("/"+file); 

这种方法是有缺陷的,JRE会对读入的文件进行缓存,应用启动后,无法刷新
5 楼 lfp001 2010-12-24  
<p>直接用this.getClass().getResource方法是可以读取资源文件的,但要求集成环境和JAR包运行时资源文件放入不同的的路径。也就是说pinyin.txt在两种情况下应该放入不同的位置。</p>
<p>在这两条语句前</p>
<div class="quote_div">Properties p = new Properties(); <br>URL url=this.getClass().getResource("/"+file);</div>
<p> </p>
<p>前加入:</p>
<p>System.out.println(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath());<br>System.out.println(this.getClass().getResource("/"));</p>
<p>System.out.println(this.getClass().getResource(""));</p>
<p>第一个语句是打印classpath的绝对路径。在集成环境和JAR包运行时打印的结果不同,根据打印的结果就应该知道资源文件就放入JAR包什么位置,在集成环境时应该放入到哪才行。</p>
<p> </p>
<p>getResource方法的参数以斜杠开头表示url相对于根classpath的路径。</p>
4 楼 fuzao 2010-12-24  
this.properties=loadProperties("pinyin.txt");  
pinyin.txt跟jar包平级,可以读的
3 楼 gloomyd 2010-12-24  
哦。忘记了要不是那个"/"了。
2 楼 gloomyd 2010-12-24  
this.getClass().getClassLoader().getResourceAsStream("/"+file);
用这个try try。
1 楼 苍山洱海 2010-12-24  
对,读取配置文件就是要用getResourceAsStream()比较靠谱的。
别的或多或少都回出一些问题。

相关推荐

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

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

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

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

    浅谈两个jar包中包含完全相同的包名和类名的加载问题

    下面小编就为大家带来一篇浅谈两个jar包中包含完全相同的包名和类名的加载问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    解决java打包之后无法加载静态资源的问题SWTResourceManager.java源码

    利用swt中的一个获取图片的类SwingResourceManager 来解决将程序打为使用java打包之后,生成的jar包中图片找不着的。这是因为通过class.getResource()方法在IDEA中运行的路径和生成jar包获取的的路径是不同的。打成...

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

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

    基于适配spring boot工程开发,在以spring boot框架为基础的项目工程中的pom.xml文件引入的工具包

    支持从当前运行的spring boot工程jar包中读取javascript,css文件。支持在请求URL携带字符编码名称获取相应的字符编码格式的js、css文件。支持替换css文件中url引用资源的相对路径为可访问的绝对路径。支持使用yui...

    zip4j_1.3.2 - Java操作zip压缩文件接口最新版本

    资源包括:jar包、文档、源码和一些官方示例 该项目的官方说明: Key features(主要特性): Create, Add, Extract, Update, Remove files from a Zip file &#40;针对ZIP压缩文件创建、添加、抽出、更新和移除文件...

    网管教程 从入门到精通软件篇.txt

    JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JFF,JFIF,JIF:JPEG文件 JPE,JPEG,JPG:JPEG图形文件 JS:javascript源文件 JSP:HTML网页,其中包含有对一个Java servlet...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    JAVA_API1.6文档(中文)

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    Java范例开发大全 (源程序)

     实例144 读取jar包文件 215  实例145 文件的加密/解密操作 217  实例146 复制图片 219  实例147 随机读写Java类文件 221  第3篇 Java面向对象编程  第8章 面向对象(教学视频:72分钟) 226  8.1 类 ...

    JDK_1_6 API

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    java范例开发大全(pdf&源码)

    实例144 读取jar包文件 215 实例145 文件的加密/解密操作 217 实例146 复制图片 219 实例147 随机读写Java类文件 221 第3篇 Java面向对象编程 第8章 面向对象(教学视频:72分钟) 226 8.1 类 226 实例148 简单的...

    java范例开发大全源代码

     实例144 读取jar包文件 215  实例145 文件的加密/解密操作 217  实例146 复制图片 219  实例147 随机读写Java类文件 221  第3篇 Java面向对象编程  第8章 面向对象(教学视频:72分钟) 226  ...

    java范例开发大全

    实例144 读取jar包文件 215 实例145 文件的加密/解密操作 217 实例146 复制图片 219 实例147 随机读写Java类文件 221 第3篇 Java面向对象编程 第8章 面向对象(教学视频:72分钟) 226 8.1 类 226 实例148 简单的...

    JavaAPI中文chm文档 part2

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    java api最新7.0

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    JavaAPI1.6中文chm文档 part1

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    [Java参考文档]

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

Global site tag (gtag.js) - Google Analytics