发布于2026-07-02 阅读(0)
扫一扫,手机访问
在 Ja va 控制台交互中,Console.reader() 总会返回一个 Reader 实例。但说实话,很多人拿到这个对象后直接拿它读字符串、读整数,结果发现完全使不上劲——原因很简单:Reader 是字符流层面最底层的抽象,只提供 read() 这类逐个字符读取的方法,既不识别换行,也不解析数据类型。想用它读一个整数?你得自己拼字符、转类型、处理异常、消除换行符……这就像拿着基本字符集去写一个完整的 Ja va 编译器——能行,但没必要。

Console.reader() 返回的是一个 Reader 实例,但它不能直接用于读取字符输入变量(如字符串、整数等),而只是提供底层的字符流读取能力。它不带缓冲、不解析数据类型、也不处理换行或编码细节——这些都得你手动实现。
因为 Reader 是面向字符的抽象类,只支持按字符或字符数组读取(如 read()、read(char[])),不提供 nextInt()、nextLine() 这类语义化方法。比如想读一个整数,你得自己:
int推荐做法是把 Console.reader() 传给 Scanner 构造器,这样就能用熟悉的 nextLine()、nextInt() 等方法:
Console console = System.console();
if (console != null) {
Scanner scanner = new Scanner(console.reader());
String name = scanner.nextLine(); // 读一行字符串
int age = scanner.nextInt(); // 读一个整数
scanner.nextLine(); // 消耗掉 nextInt 后残留的换行
}
这个 Reader 实例有几点关键约束:
nullmark()/reset(),不可回退读取位置console.readPassword(),而非 reader如果真要用 reader() 读单个字符(比如确认 Y/N):
Reader r = System.console().reader();
int c = r.read(); // 阻塞等待一个字符(含回车)
if (c == 'y' || c == 'Y') {
System.out.println("Confirmed.");
}
注意:回车符 \n 或 \r\n 也会被当作字符读入,需额外判断和清理。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8