inputstreamreader 无法直接获取当前使用字符编码名称,最可靠方式是在构造时显式指定编码(如"utf-8")并自行保存;未指定时采用平台默认编码,可通过 charset.defaultcharset().name() 查询,但不可靠;getencoding() 方法返回值不保证准确,不建议依赖。

InputStreamReader 本身不提供直接获取“当前使用字符编码名称”的方法,因为它内部使用的编码是只读的,且没有公开 API 返回已解析的编码名(比如 UTF-8、GBK)。但你可以通过以下方式间接获取或确认它实际使用的编码:
1. 构造时明确指定编码,就用你传入的名称
如果你在创建 InputStreamReader 时显式传入了 Charset 或编码名(如 "UTF-8"),那它用的就是这个。这是最可靠的方式:
- 用
new InputStreamReader(in, "GBK")→ 实际编码就是"GBK" - 用
new InputStreamReader(in, StandardCharsets.UTF_8)→ 可以调用charset.name()得到"UTF-8"
2. 未指定编码时,默认使用平台默认编码(不可靠)
如果只写 new InputStreamReader(in),它会调用 Charset.defaultCharset() 获取默认编码,你可以这样查:
-
Charset.defaultCharset().name()返回当前 JVM 默认编码名(如"GBK"在 Windows 中,"UTF-8"在多数 Linux/macOS) - 注意:这个值受系统环境、启动参数(
-Dfile.encoding=xxx)影响,运行时可能变化
3. 无法从已创建的 InputStreamReader 实例反查编码名
InputStreamReader 没有 public 方法返回其内部 Charset 或编码名。它的 getEncoding() 方法返回的是:
- 如果构造时指定了编码(或能推断出明确编码),返回规范化的编码名(如
"UTF8"→"UTF-8") - 如果底层字节流没有 BOM、也未指定编码,且依赖平台默认,则
getEncoding()仍可能返回默认编码名,但行为不保证 —— 官方文档明确说明:“此方法返回的字符串可能为 null,也可能不是实际用于解码的编码” - 实践中,
getEncoding()在多数 JDK 版本中对显式指定编码的实例是可用的,但不建议依赖它做逻辑判断
4. 更健壮的做法:封装并记录编码
避免事后猜测,推荐在创建时就持有编码信息:
- 自己封装一个带编码字段的 Reader 包装类
- 或用局部变量保存编码名:
String encoding = "UTF-8"; Reader reader = new InputStreamReader(in, encoding); - 处理 HTTP 响应、文件头、BOM 等场景时,优先从源头(如 Content-Type、文件签名)确定编码,再构造 InputStreamReader
不复杂但容易忽略:编码信息必须在构造阶段确定,之后无法可靠追溯。所以关键不是“怎么取”,而是“怎么管住它”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











