`
zhangcong170
  • 浏览: 70969 次
  • 性别: 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()比较靠谱的。
别的或多或少都回出一些问题。

相关推荐

    Java实现从jar包中读取指定文件的方法

    本篇文章将详细讲解如何在Java中实现从JAR包中读取指定文件的方法。 首先,Java提供了`java.util.jar`包,其中包含处理JAR文件所需的类。`JarFile`类是核心类,它允许我们打开并操作JAR文件。在给定的代码示例中,`...

    删除jar包中的指定文件

    标题“删除jar包中的指定文件”涉及到的是Java开发中对已打包JAR文件进行操作的知识点。在Java中,JAR(Java Archive)文件是一种归档格式,用于将多个类文件和其他资源组合到一个单一的文件中,方便分发和执行。...

    如何加载jar包中的spring配置文件

    在Spring MVC项目中,加载jar包中的Spring配置文件是一个常见的需求,特别是在进行SSM(Spring、Spring MVC、MyBatis)整合时。SSM框架的整合通常涉及到多个配置文件的组织和管理,其中一部分配置可能会被打包到独立...

    spring读取jar中的配置文件

    当我们的应用程序被打包成JAR文件后,有时我们需要从JAR内部读取配置文件,例如application.properties或application.yml。本文将深入探讨如何在Spring框架中实现这一功能。 首先,理解Spring的资源配置。Spring...

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

    本文将深入探讨如何解决SpringBoot jar包中的文件读取问题。 首先,让我们回顾一下问题的背景。在开发SpringBoot微服务时,开发人员小明遇到了一个问题,即在本地开发环境中能够正常读取资源文件,如word文档或模板...

    Jar包中如何正确地加载资源文件博文中用到的测试项目源码

    本篇文章将详细探讨如何在Java中正确地从JAR包中加载资源文件,并提供相应的源码示例。 首先,理解Java类路径(classpath)是关键。类路径是指Java虚拟机(JVM)查找.class文件和其他资源文件的路径。当你运行一个...

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

    Java读取Jar中资源文件是一种常见的操作,在开发Java项目时,经常需要读取jar包中的资源文件。下面将详细介绍Java读取Jar中资源文件的实现代码和应用。 一、Java读取Jar中资源文件的必要性 在Java项目中,经常需要...

    读取war包或jar包内的文件

    在JAR包中,资源通常与对应的类同级或者在特定的目录下。 4. **相对路径与绝对路径**: 在指定资源路径时,可以使用相对路径(相对于当前类或指定类)或绝对路径(从根目录开始)。相对路径更灵活,但可能引起找不到...

    jar包中类的加载及jar中资源的使用

    在Java编程环境中,`jar`(Java Archive)文件是一种打包工具,它将多个类文件、资源文件以及其他元数据集合在一起,便于分发和执行。本文将深入探讨`jar`包中类的加载机制以及如何在Java程序中使用`jar`中的资源。 ...

    读取jar文件

    在开发过程中,经常会遇到需要从jar包中读取资源文件(如图片、音频等)的情况。这涉及到如何定位和访问这些文件的问题。本文将深入探讨如何在Java环境中有效地处理这类需求。 #### 二、基本概念与原理 在Java中,...

    jar 包 内文件读取 文件内容

    2. **读取JAR内的资源文件**: - `JarInputStream`:如果你知道要读取的文件名,可以通过`java.util.zip.JarInputStream`类来实现。这个类允许你逐个读取JAR文件中的条目,而无需一次性加载所有内容到内存。 3. **...

    dom4j从jar包中读取xml文件的方法

    总结起来,DOM4J从JAR包中读取XML文件,主要涉及以下知识点: 1. DOM4J的`SAXReader`类用于解析XML文档。 2. Java的`ClassLoader`用于加载类和资源,特别是JAR包内的资源。 3. `getResource`和`getResourceAsStream`...

    JAVA编程-分割合并文件-jar包中含源码

    提供的jar包中包含了源码,这意味着我们可以学习和理解实现文件分割和合并的具体算法和逻辑。通过阅读源码,开发者可以了解到如何控制文件的读写操作,如何管理多个文件的顺序,以及如何处理可能出现的错误和异常。...

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

    在Java编程中,有时我们需要在运行时访问JAR文件内部的资源,如图片、文本文件等。本示例将详细讲解如何从JAR文件中读取图片和文本,并将其保存或显示出来。以下是对给定标题和描述的详细解读。 首先,`GetJarFile....

    分jar包资料

    首先,我们来看"从jar包中读取资源文件(转)"这个话题。在Java程序中,有时我们需要从jar包内部读取如配置文件、图片或字体等资源。这可以通过`java.util.jar.JarFile`类来实现,通过指定jar文件路径创建`JarFile`...

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

    了解Jar包中的类加载问题 Java中的类加载机制是指Java虚拟机(JVM)在加载类文件时的相关处理过程。当多个Jar包中包含相同的包名和类名时,可能会出现类加载问题。下面我们来讨论这种情况下的类加载问题。 类加载...

    jar包、class文件读取工具

    1. jar包结构:jar文件本质上是一个基于ZIP格式的文件,包含了一个或多个.class文件,以及相关的资源文件(如图片、配置文件等)。每个类文件都以`.class`为扩展名,且按照Java包的层次结构进行组织。例如,`...

    Spatialite_for_Android所使用的jar包、so文件、测试数据库

    1. jsqlite.jar:这是包含Spatialite功能的Java库,Android应用通过它来调用Spatialite的API,创建、读取、更新和删除空间数据。 2. test.sqlite:这是一个测试数据库文件,用于验证和调试代码,开发者可以通过查询...

    解析xml文件需要的jar包

    而提供的文件列表似乎对应于一个ASP.NET的Web应用,这可能意味着XML解析发生在服务器端的Java组件中,或者是用户误将ASP.NET的文件列为了Java解析XML所需的资源。在实际开发中,确保正确引入和配置解析XML所需库是至...

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

    例如,如果第三方jar包中的配置文件是`quartz.xml`,我们可以这样写: ```java package com.chhliu.springboot.config; import org.springframework.context.annotation.Configuration; import org.spring...

Global site tag (gtag.js) - Google Analytics