Java从jar包中读取资源文件的方法
需积分: 9 196 浏览量
更新于2024-09-11
收藏 7KB TXT 举报
"这篇文章主要探讨了如何在Java中读取jar包内的文件,特别是当文件位于jar文件的特定路径下时。示例代码展示了两种不同的方法,但它们都无法直接在jar环境中工作,因为它们尝试从文件系统而不是从jar内读取资源。文中还提到了在打包成jar后,资源文件的路径问题以及Java类加载器如何查找资源。"
在Java开发中,有时我们需要在运行时读取jar包内的资源文件,例如配置文件、图片或者数据文件。然而,直接使用`File`对象来尝试读取这些文件是无效的,因为在jar环境下,文件并不实际存在于文件系统中,而是作为jar的一部分存储。以下是两个示例代码片段(称为“代码段1”),尝试从jar内部读取文本文件`res.txt`:
```java
// 代码段1
package edu.hxraid;
import java.io.*;
public class Resource {
public void getResource() throws IOException {
File file = new File("bin/resource/res.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String s = "";
while ((s = br.readLine()) != null)
System.out.println(s);
}
}
```
这段代码假设`res.txt`位于项目结构的`bin/resource`目录下,但在构建为jar之后,这个路径不再适用。正确的做法是利用类加载器(`ClassLoader`)来获取jar内的资源。当`Resource`类被打包进jar(如`ResourceJar.jar`)时,`res.txt`应被放在`edu/hxraid/resource`路径下。为了在jar中读取资源,可以使用以下方法:
```java
// 修正后的代码
package edu.hxraid;
import java.io.*;
public class Resource {
public void getResource() throws IOException {
ClassLoader loader = getClass().getClassLoader();
InputStream is = loader.getResourceAsStream("resource/res.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s = "";
while ((s = br.readLine()) != null)
System.out.println(s);
}
}
```
这里,我们通过`getClass().getClassLoader()`获取当前类的类加载器,然后使用`getResourceAsStream()`方法,传入相对于类路径的资源文件路径(不包含`bin`目录,因为类路径已包含了这个信息)。这样,类加载器会在jar内查找资源,并返回一个`InputStream`,我们可以通过它来读取内容。
在打包项目时,确保资源文件`res.txt`位于`src/main/resources`目录(如果使用Maven)或`src/resources`(如果使用Gradle),这样构建工具会自动将其打包到正确的路径下。在Eclipse中,如果项目结构如下:
1. `src/`
- `src/edu/hxraid/Resource.java`
2. `bin/`
- `bin/resource/res.txt`
- `bin/edu/hxraid/Resource.class`
那么在打包为jar后,`res.txt`会位于`edu/hxraid/resource`目录下,与`Resource.class`处于同一jar内。在运行jar时,类加载器会正确找到并加载资源。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2023-06-01 上传
2023-06-01 上传
2010-06-21 上传
2018-08-08 上传
2019-04-08 上传
lx13345
- 粉丝: 1
- 资源: 24
最新资源
- JHU荣誉单变量微积分课程教案介绍
- Naruto爱好者必备CLI测试应用
- Android应用显示Ignaz-Taschner-Gymnasium取消课程概览
- ASP学生信息档案管理系统毕业设计及完整源码
- Java商城源码解析:酒店管理系统快速开发指南
- 构建可解析文本框:.NET 3.5中实现文本解析与验证
- Java语言打造任天堂红白机模拟器—nes4j解析
- 基于Hadoop和Hive的网络流量分析工具介绍
- Unity实现帝国象棋:从游戏到复刻
- WordPress文档嵌入插件:无需浏览器插件即可上传和显示文档
- Android开源项目精选:优秀项目篇
- 黑色设计商务酷站模板 - 网站构建新选择
- Rollup插件去除JS文件横幅:横扫许可证头
- AngularDart中Hammock服务的使用与REST API集成
- 开源AVR编程器:高效、低成本的微控制器编程解决方案
- Anya Keller 图片组合的开发部署记录