java - System.in.read() 行为我无法解释

标签 java string output

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 时,会发生两件事:

因此,如您所见,如果您想在每次下一次迭代中暂停循环,则需要在离开当前迭代之前清空输入流中的数据。但是 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/

相关文章:

java - 输入输出异常处理

c - 如何在C中使用简单的文件输入和输出

java - 如何在 Java 代码中动态获取 Oracle 数据库中同义词的函数或过程参数

java - 扩展现有的 spring jpa 存储库功能

java - 是否有 EGLImage 的 java 版本可以有效地从 OpenGL 读取像素?

c++ - getline(cin, var) 不工作!

java - 为什么 string.intern() 这么慢?

c - 我想打破存储在数组中 '\n' 字符处的字符串?

output - 如何将 Pulumi Output<t> 转换为字符串?

java - 从 Windows 任务计划程序运行 Java GUI 应用程序不起作用