我正在研究一个Java A初学者指南(第9版)一书中提供的一个示 routine 序,该书由赫伯特·斯柴尔特 compose .该示例为:

下面的程序通过读取字符来演示read() 控制台,直到用户键入句点.

代码如下所示:

import java.io.*;

public class ReadChars {

    public static void main(String[] args) throws IOException{

        char c;
        
        BufferedReader br = new BufferedReader(
                new InputStreamReader(System.in, System.console().charset()));
        
        System.out.println("Enter characters, period to quit.");
        
        do {
            c = (char) br.read();
            System.out.println(c);
        } while (c != '.');
    }

}

它们提供的示例输出如下所示:

Enter characters, period to quit.
One Two.
O
n
e

T
w
o
.

在我看来,输入(如上所述)终止于'.'个字符,然后打印到控制台.

但是,当我自己运行该示例时,输出看起来更像这样:

Enter characters, period to quit.
abcde.fghij<return>
a
b
c
d
e
.

也就是说,我首先必须以<return>结束输入,然后才能正确打印字符,直到输入中的第一个'.'个字符.

我想了解这里到底发生了什么.我认为这与控制台输入以某种方式缓冲并仅在<return>上刷新有关,但对我来说,考虑到代码的 struct ,这有点令人困惑,它读取并打印do-While循环中的字符,应该在遇到'.'时立即中断.

与示例输出(即上面的第一个输出)形成对比的是,是否有人能够分解导致此行为(即上面的最后一个输出)的发生的事情的顺序?

推荐答案

System.in which you are using is buffered under the hood. The input will be send to the program only after you press return.
For this kind of functionality is better to use: Scanner class.

我认为这本书的作者并不意味着输入终止于".性格.我想输入的是One Two.return,与您输入的方式相同.

Java相关问答推荐

Java Stream,需要更新列表对象列表

Javascript在边界中心调整ImageView大小

替换com. sun. jndi. dns. DnsContextFactory Wildfly23 JDK 17

使用JdkClientHttpRequestFactory通过Spring RestClient和Wiemock读取时达到EOF

为什么在枚举中分支预测比函数调用快?

无法使用ApacheSpark依赖项构建JavaFX应用程序

如何在JavaFX中处理多个按钮

JNI:将代码打包成自包含的二进制文件

Oj算法 MatrixR032从字符串、归一化和余弦相似度计算创建

根本不显示JavaFX阿拉伯字母

将关闭拍卖的TimerService

本机方法(JNI)总是编译的吗?

如何在Java中的重写方法参数中强制(Enum)接口实现?

ChromeDriver 版本 117+ 强制另存为对话框 - 如何绕过? (selenium/Java)

为什么 JavaFX TextArea 中的 selectRange() 有时不突出显示所选内容?

与其他带 @Primary 注释的 bean 发生冲突 (NoUniqueBeanDefinitionException)

BigDecimal stripTrailingZeros 和相等

Java Swing – 同步动画线程的资源

当 url 包含本地文件的片段时,Javafx getHostServices().showDocument 不起作用

Spring Boot不创建数据库表