inputstreamreader的getencoding()返回实际解码所用charset的规范名称(如utf-8、gbk),非构造参数字符串,可能为null;其值取决于构造方式(显式指定、默认编码或charset对象),初始化后固定不变。

InputStreamReader 提供了 getEncoding() 方法,用于返回它**实际使用的字符集名称**(即解码时采用的 charset 名称),但要注意:这个方法返回的是底层 Charset 的规范名称(如 UTF-8、GBK、ISO-8859-1),**不是构造时传入的字符串参数**,且在某些情况下可能返回 null。
getEncoding() 的行为特点
该方法返回的是 InputStreamReader 内部绑定的 Charset 对象的 name(),也就是 JVM 实际用来解码字节流的字符集。它的值取决于构造方式:
- 显式指定 charset(推荐):
new InputStreamReader(in, "UTF-8")→getEncoding()返回"UTF-8" - 仅传入 InputStream:
new InputStreamReader(in)→ 使用系统默认编码(如 Windows 中常为GBK,Linux/macOS 常为UTF-8),getEncoding()返回对应默认 charset 名称 - 使用 Charset 对象构造:
new InputStreamReader(in, StandardCharsets.UTF_8)→ 同样返回"UTF-8" - 如果底层 Stream 不支持或初始化失败(极少见),可能返回
null
调用时机很重要
getEncoding() 应在 InputStreamReader 创建后、首次读取前或读取过程中调用。它不会随读取内容动态变化,但一旦 InputStreamReader 初始化完成,返回值就固定了。
注意:不能在构造后立即断言结果一定非 null —— 虽然绝大多数情况正常,但若底层平台缺失对应 Charset 或发生安全限制,可能返回 null(实践中罕见,但仍需防御性判断)。
简单示例代码
✔ 正确用法:
InputStream in = new FileInputStream("test.txt");
InputStreamReader reader = new InputStreamReader(in, "UTF-8");
System.out.println(reader.getEncoding()); // 输出:UTF-8
// 或使用默认编码
InputStreamReader defaultReader = new InputStreamReader(in);
System.out.println(defaultReader.getEncoding()); // 如:GBK 或 UTF-8,依系统而定
常见误区提醒
-
不要依赖构造参数字符串:比如传
"utf8"(非标准名),JVM 会自动映射到"UTF-8",getEncoding()返回的是标准化名称"UTF-8",不是原始字符串 -
不等于文件真实编码:该方法只反映 InputStreamReader 的解码配置,若文件实际编码与之不符(如用 UTF-8 解码 GBK 内容),仍会乱码,但
getEncoding()依然返回你指定的"UTF-8" - 无法动态切换编码:InputStreamReader 的编码在创建时确定,不可更改;要换编码必须新建实例
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











