Java中将输入流转字符串的核心是按指定编码读取并解码,推荐用InputStreamReader+BufferedReader(支持UTF-8、高效),次选Scanner(便捷但有内存风险)或Java9+的readAllBytes(简洁但需内存充足),须避免toString()、未指定编码及资源泄漏。

Java 中把输入流转换成字符串,核心思路是读取输入流中的字节或字符,再按指定编码解码为字符串。关键在于选择合适、安全的方式,避免乱码或资源泄漏。
推荐方式:使用 InputStreamReader + BufferedReader
适合大多数场景,可控性强,支持指定字符编码(如 UTF-8),且能高效逐行或整体读取:
- 用 InputStreamReader 包装原始
InputStream,并显式传入StandardCharsets.UTF_8(或其他编码) - 套一层 BufferedReader 提升读取效率
- 调用
readLine()拼接,或用lines().collect(Collectors.joining(" "))一行搞定(Java 8+)
try (InputStream is = ...;
InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr)) {
String content = br.lines().collect(Collectors.joining("
"));
}
简洁方式:使用 Scanner
适合小文本、快速原型,自动处理编码和换行,但不适用于超大流(有内存风险):
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 用
new Scanner(inputStream, "UTF-8")构造 - 调用
useDelimiter("\A").next()一次性读完全部内容("\A"表示输入开头,使next()匹配整个流)
现代方式:Java 9+ 的 InputStream.readAllBytes()
最简写法,适合内存充足、数据量不大的情况:
立即学习“Java免费学习笔记(深入)”;
- 先用
is.readAllBytes()得到byte[] - 再用
new String(bytes, StandardCharsets.UTF_8)转字符串
避坑提醒
-
别用
inputStream.toString()—— 它返回的是对象地址,不是内容 - 务必指定编码,不传编码会用系统默认,跨环境极易乱码
- 记得关闭流,优先用 try-with-resources 自动释放
- 第三方库如 Apache Commons IO 的
IOUtils.toString(is, "UTF-8")也可用,但引入依赖需权衡

















