推荐用字符流读取控制台输入:先用inputstreamreader指定utf-8编码转换system.in,再用bufferedreader的readline()读取整行;或直接使用scanner封装,更简洁安全。

Java 中读取控制台输入,**字节流和字符流的用法有本质区别**:字节流(如 System.in)直接操作原始字节,适合处理二进制或未知编码数据;字符流(如 BufferedReader)基于字符,需指定编码,更适合读取文本(比如用户输入的字符串)。实际开发中,**推荐用字符流方式读取控制台输入**,更安全、便捷、符合文本语义。
用字节流读取(不推荐直接使用)
System.in 是 InputStream 的实例,属于字节流。它能读取字节,但无法直接按行或按字符串读取,且不处理字符编码,容易出乱码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 调用
System.in.read()每次只读一个字节(0–255),返回int,-1 表示结束;中文等多字节字符会被拆开,导致乱码 - 若想读一行,需手动缓冲、判断换行符(
\n或\r\n),还要注意编码问题(如 UTF-8 下中文占 3 字节) - 示例片段(仅作理解,勿在生产中这样写):
StringBuilder sb = new StringBuilder();
while ((b = System.in.read()) != '\n' && b != -1) {
sb.append((char) b); // ❌ 编码错误,中文会乱码
}
用字符流读取(标准做法)
将 System.in 包装成字符流,核心是:**先用 InputStreamReader 转换编码,再用 BufferedReader 提供高效读行能力**:
-
new InputStreamReader(System.in, StandardCharsets.UTF_8)显式指定 UTF-8 编码,避免平台默认编码导致的乱码(尤其 Windows 默认 GBK) -
BufferedReader提供readLine()方法,一次读取一整行(不含换行符),返回String,天然支持中文等 Unicode 字符 - 完整示例:
new InputStreamReader(System.in, StandardCharsets.UTF_8)
);
String line = reader.readLine(); // 阻塞等待输入,回车后返回字符串
if (line != null) {
System.out.println("你输入了:" + line);
}
简化写法:Scanner(最常用)
Scanner 是字符流的高级封装,底层也基于 InputStreamReader,语法更简洁,适合日常控制台交互:
- 构造时传入
System.in,自动按平台默认编码处理(建议仍显式指定):new Scanner(System.in, "UTF-8") - 提供类型化读取方法:
nextLine()(读整行)、nextInt()、nextDouble()等,自动跳过空白、解析类型 - 注意:
nextXXX()(除nextLine()外)不会消费换行符,后续调用nextLine()可能立刻返回空字符串——这是常见陷阱
关键提醒
- 别用
System.in.read()直接读字符串,它不是为文本设计的 - 务必显式指定字符编码(如
StandardCharsets.UTF_8),不要依赖系统默认值 -
BufferedReader和Scanner都是阻塞式读取,程序会停在readLine()或nextLine()等待用户敲回车 - 使用完记得关闭资源(
reader.close()或scanner.close()),或用 try-with-resources 自动释放
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










