Java从jar包中读取资源文件的方法

需积分: 9 0 下载量 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时,类加载器会正确找到并加载资源。