class E92StringDemo {
public static void main(String args[]) throws java.io.IOException {
String strObj1 = "First String";
for (int i = 0; i < strObj1.length(); i++) {
System.out.print(strObj1.charAt(i));
System.in.read(); //just to pause the execution till i press enter key
}
}
}
我希望输出如下:
F
i
r
s
t...
但是输出是这样的:
F
ir
st
S
tr
in
g
我不确定每次按 enter
键 (\n) 时为什么会在一行中显示 2 个字符?
我正在运行 windows 8 并使用命令提示符通过 javac
运行文件。
最佳答案
问题
System.in.read()
只有在标准输入流(由 System.in
表示)中没有要读取的数据时才会暂停应用程序的执行。
但是在控制台中,当您按下 ENTER 时,会发生两件事:
- 控制台光标移动到下一行
OS dependent line separator* 放置在标准输入中,对于 Windows 是
\r\n
:- 回车
\r
- 放置在 index 13 in Unicode Table - 换行
\n
- 放置在 index 10 in Unicode Table
- 回车
因此,如您所见,如果您想在每次下一次迭代中暂停循环,则需要在离开当前迭代之前清空输入流中的数据。但是 System.in.read()
一次只读取 一个 字符,在你的情况下 \r
离开 \n
用于下一次迭代(所以没有暂停)。
因此,在暂停再次可用之前,您需要在一次迭代中阅读两次。
解决方案
如果您想以独立于操作系统的方式摆脱这个问题,请使用 BufferedReader#readLine()
或 Scanner#nextLine
,例如:
String strObj1 = "First String";
try(Scanner sc = new Scanner(System.in)){//will automatically close resource
for (int i = 0; i < strObj1.length(); i++) {
System.out.print(strObj1.charAt(i));
sc.nextLine();
}
}
这些方法还解决了在按下 enter 之前放置潜在额外字符的问题,因为它们中的每一个也将被放置在标准输入流中,这将需要额外的 .read()
调用。
* 以及在按回车键之前提供的其他潜在字符
关于java - System.in.read() 行为我无法解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43254898/