在IntelliJ(Windows10)中Scanner类为何先返回\n而非\r?
为什么Windows下IntelliJ中Java代码输入Enter输出10而非13?
问题场景
在Windows 10系统的IntelliJ中运行以下Java代码:
import java.util.Scanner; public class Main { public static void main(String ... args) { Scanner reader = new Scanner(System.in); reader.useDelimiter(""); String s = reader.next(); System.out.println((int)s.charAt(0)); } }
按下Enter键作为输入时,输出为:
10
按道理Windows的换行符是\r\n(对应ASCII码13和10),为什么输出不是13?
原因解析
这是因为IntelliJ的控制台做了换行符归一化处理:
- 不管你在Windows系统下输入回车产生的
\r\n,还是其他系统的换行符,IntelliJ都会自动转换成跨平台通用的\n(ASCII码10),以此保证代码在不同平台下的行为一致性。 - 你的代码通过
reader.useDelimiter("")让Scanner每次读取单个字符,但此时控制台已经把\r\n转换成了\n,所以读到的第一个字符就是\n,输出自然是10。
验证原生换行符的方法
如果想看到Windows原生的\r(ASCII码13),可以跳过IntelliJ控制台,直接在**命令提示符(CMD)**中运行编译后的.class文件,此时输入回车,就能读到\r,输出13。
内容的提问来源于stack exchange,提问作者Evan Aad
相关产品推荐
相关产品推荐

