inputstreamreader 不负责解压,仅转换字节流为字符流;需先用 class.getresourceasstream() 获取 jar 内资源流,再以 standardcharsets.utf_8 等标准编码构造 inputstreamreader,并注意路径格式与编码一致性。

Java 中 InputStreamReader 本身不负责解压,它只是把字节流按指定编码转成字符流。真正从 JAR 包中读取资源并解压(其实是“解包”,JAR 是 ZIP 格式,无压缩时直接提取)需要先获取 InputStream,再用 InputStreamReader 包装并指定编码。
从 JAR 中定位并打开资源流
资源必须以 classpath 路径形式存在(如 /config/app.txt),不能用文件系统路径。推荐用 Class.getResourceAsStream() 或 ClassLoader.getResourceAsStream() 获取输入流:
- 路径以
/开头:从 classpath 根开始查找(如/data/sample.txt) - 路径不以
/开头:相对于当前类所在包查找(如"sample.txt") - 返回
null表示资源未找到,需检查路径拼写、是否被打包进 JAR、是否在 classpath 中
用 InputStreamReader 指定编码读取
拿到 InputStream 后,直接传给 InputStreamReader 构造函数,并传入编码名(如 "UTF-8")。注意:编码名必须是 Java 支持的标准名称(如 "GBK"、"ISO-8859-1"),不能写 "utf8"(少横线会抛 UnsupportedEncodingException):
-
new InputStreamReader(in, "UTF-8")✅ -
new InputStreamReader(in, "utf8")❌(运行时报错) - 建议使用
StandardCharsets.UTF_8(Java 7+),类型安全且避免拼写错误:new InputStreamReader(in, StandardCharsets.UTF_8)
完整示例:读取 JAR 内的 UTF-8 文本文件
以下代码读取位于 JAR 包根目录下的 message.txt,内容为 UTF-8 编码:
try (InputStream is = MyClass.class.getResourceAsStream("/message.txt");
InputStreamReader reader = new InputStreamReader(is, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(reader)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
注意三点:资源路径带前导 /;显式指定 StandardCharsets.UTF_8;用 try-with-resources 自动关闭流,避免泄漏。
常见问题与避坑
实际开发中容易出错的地方:
- JAR 中文本文件保存时编码和读取时编码不一致 → 出现乱码(如文件用 GBK 保存,却用 UTF-8 读)
- Maven 打包时未设置
project.build.sourceEncoding,导致资源文件编码被错误转换 - IDE(如 IntelliJ)中资源文件默认编码不是 UTF-8,需在 Settings → Editor → File Encodings 中统一设为 UTF-8 并勾选 “Transparent native-to-ascii conversion”
- 不要用
FileInputStream去读 JAR 内部路径(如new FileInputStream("jar:file:/xxx.jar!/data.txt")),这会报文件不存在 —— JAR 内资源不是普通文件系统路径
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











