今天写代码的时候发现一个有趣的问题,就是在代码中读取一些资源文件(txt,gif等等)时候,单独运行的时候,当然没问题,但是当我们将项目打包成jar后,尽管资源文件在jar包内,但我们却怎么也访问不到它了。
代码结构如下:
-
src|---com
-
---cn
-
---ChineseUtil.java
-
src|---pinyin.txt
ChineseUtil.java
-
packagecom.cn;
-
-
importjava.io.FileInputStream;
-
importjava.io.FileNotFoundException;
-
importjava.io.IOException;
-
importjava.io.InputStream;
-
importjava.net.URL;
-
importjava.util.Properties;
-
-
publicclassChineseUtil{
-
privatePropertiesproperties;
-
-
publicChineseUtil(){
-
this.properties=loadProperties("pinyin.txt");
-
}
-
-
-
/**
-
*加载资源文件
-
*@paramfile
-
*@return
-
*/
-
privatePropertiesloadProperties(Stringfile){
-
Propertiesp=newProperties();
-
URLurl=this.getClass().getResource("/"+file);
-
System.out.println(url.getPath());//输出文件路径
-
try{
-
p.load(newFileInputStream(url.getFile()));
-
}catch(FileNotFoundExceptione){
-
e.printStackTrace();
-
}catch(IOExceptione){
-
e.printStackTrace();
-
}
-
returnp;
-
}
-
}
在本工程下,测试代码如下:
-
publicclassPinyinTest{
-
publicstaticvoidmain(String[]args){
-
ChineseUtilutil=newChineseUtil();
-
}
-
}
测试一切正常,没有抛出异常,但是当我们将该项目打包成jar,新建一个java工程,并仍然采用上面的java代码进行测试时,却发现代码抛出异常:
-
file:/D:/frame/pinyin.jar!/pinyin.txt
-
<spanstyle="color:#ff0000;">java.io.FileNotFoundException:file:\D:\frame\pinyin.jar!\pinyin.txt(文件名、目录名或卷标语法不正确。)</span>
抛出异常了,找不到资源文件了!让我们注意一下输出的文件的路径,file:\D:\frame\pinyin.jar!\pinyin.txt,和一般的文件路径相比,多了一个!,你不仔细观察,是看不出来的!查阅了相关资料,原来jar包中文件URL有专用格式的:jar:<url>!/{entry},而我们是不能以这种形式来new一个File的,那该怎么做呢,我们把
loadProperties方法修改如下:
-
privatePropertiesloadProperties(Stringfile){
-
Propertiesp=newProperties();
-
//注意加载资源文件的写法/表示从根目录开始否则就表示从当前类所在的路径下开始
-
InputStreamis=this.getClass().getResourceAsStream("/"+file);
-
try{
-
p.load(is);
-
}catch(FileNotFoundExceptione){
-
e.printStackTrace();
-
}catch(IOExceptione){
-
e.printStackTrace();
-
}
-
returnp;
-
}
即通过通过Class类的getResourceAsStream()方法来获取文件,这个方法是透明的,你可以像普通的File一样去定位jar包中的资源文件(不管你是jar文件还是普通的文件夹)。另外还有一个比较让人纠结的方式是使用java.util.jar.JarFile类才访问,不过使用起来非常的不习惯,具体大家可以参考API试试。
PS:接下来该看看底层是怎么实现了,有经验的朋友不妨说说
分享到:
相关推荐
Java中getResourceAsStream的用法.md
在Java编程中,`getResourceAsStream` 是一个非常实用的方法,用于从类路径或者特定上下文中获取资源流,通常用来读取配置文件、图片、XML文档等静态资源。这个方法在处理与代码打包在一起的非代码文件时非常方便。...
在Java编程中,`getClass().getResourceAsStream()`是一个非常实用的方法,用于从类路径(Classpath)中加载资源,如配置文件、图片、字体等。这个方法返回一个`InputStream`对象,可以通过它读取到资源文件的内容。...
在 Java 项目中,读取包内文件可以使用 `getResourceAsStream` 方法。例如,`InputStream in = ReadFile.class.getResourceAsStream("/com/lavasoft/res/a.txt");` 可以读取包内的文件 `a.txt`。 Java Web 项目中...
### Java工程中资源文件的用法详解 #### 概述 资源文件,通常指的是`.properties`文件,这类文件采用键值对的形式存储数据,广泛应用于Java项目中存储配置信息、国际化字符串等。通过使用`java.util.Properties`类...
使用`getResource()`或`getResourceAsStream()`方法能更好地适应这些变化。 7. **异常处理**: - 在尝试读取文件时,应该始终处理可能出现的异常,如`FileNotFoundException`,确保程序在文件不存在或无法访问时...
本文将详细介绍Java中获取文件路径的各种方法及其应用场景,帮助开发者更好地理解和掌握这些技巧。 #### 二、基本概念 在深入讨论之前,我们需要了解几个基本概念: - **Classpath**: 是Java运行环境的一个重要...
总之,Java提供了多种方式来读取项目中的资源文件,通过理解类路径和使用适当的IO方法,可以有效地在IDEA环境中加载和处理这些资源,无论是文本、音频还是图片。确保在实际应用中适当地管理和关闭资源,以保持程序的...
在Java类中,读取配置文件信息可以使用多种方法,其中一种方法是使用`this.getClass().getClassLoader().getResourceAsStream`方法。 `this.getClass().getClassLoader().getResourceAsStream`方法是Java类中的一种...
在Java中,我们通常使用`ImageIcon`类的构造函数来加载图片。以下代码展示了如何从文件系统中加载图片: ```java String imagePath = "path/to/your/image.jpg"; ImageIcon imageIcon = new ImageIcon(imagePath);...
首先,我们可以通过`java.lang.Class`类的`getResource`或`getResourceAsStream`方法来获取类路径中的资源文件路径。这两个方法都是在类路径中查找资源,返回一个URL对象,从中可以获取路径信息。例如,如果我们有一...
此外,如果你需要频繁地从JAR中读取资源,可以考虑使用`Class.getResourceAsStream()`或`ClassLoader.getResourceAsStream()`方法,它们允许你通过类路径(相对于类或类加载器)访问资源,而无需显式打开`JarFile`。...
本篇文章将详细探讨Java提供的两种主要方法:`Class.getResource`和`Class.getResourceAsStream`,用于加载类路径下的资源文件。 首先,`Class.getResource`方法返回一个`URL`对象,它表示资源的位置。这个方法接受...
例如,可以在YAML文档中定义嵌套的对象,然后使用Yaml类的load()方法将其加载到Java对象中。 结论 JAVA基于SnakeYAML实现解析与序列化YAML是JAVA开发中的一种常见需求。通过使用SnakeYAML库,可以轻松地将YAML文档...
1. **使用 `java.util.Properties` 类的 `load()` 方法** 这是最直接的方法,通过 `FileInputStream` 创建输入流,然后用 `Properties` 类的 `load()` 方法加载内容。示例代码如下: ```java InputStream in = ...
- **使用 `getResource` 和 `getResourceAsStream` 方法** - 示例: - `getClass().getResourceAsStream(filePath);` (`filePath` 例如为 "/filename",默认从 WEB-INF/classes 开始查找,适用于 Tomcat 等容器...
若图像文件被打包在JAR中,可以使用`getResourceAsStream()`方法读取: ```java InputStream inObject = getClass().getResourceAsStream("image.gif"); byte[] buffer = new byte[inObject.available()]; for (int...
1. **读取Properties文件**:使用`Properties`类的`load()`方法可以从输入流中加载`.properties`文件内容。例如,在`readPropertiesFile`方法中,通过`FileInputStream`创建输入流,并将其传递给`properties.load...
- 注意点:使用`getResourceAsStream()`方法时,路径必须以`/`开头,这表示从类路径的根目录开始查找。 #### 绝对路径的应用场景 1. **基于bin目录下的文件访问**: - 假设项目的编译输出目录为`bin`,且文件...