为什么我们不能一次从System.in读取一个字符?

aio*_*obe 18 java stdin

下面的程序打印标准写入的每个字符,但只有在写完新行之后(至少在我的系统上!).

public class Test {
    public static void main(String[] args) throws java.io.IOException {
        int c;
        while ((c = System.in.read()) != -1)
            System.out.print((char) c);
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以防止人们写"按任意键继续"之类的内容,并强制执行"按Enter键继续"等操作.

  • 这是什么原因?
  • 它是Java的限制吗?
  • 这种行为依赖于系统(我在Ubuntu上)吗?它在Mac上如何运作?视窗?
  • 它是否依赖于我运行应用程序的特定终端?(对我来说,它在Eclipse和gnome-terminal中表现得像这样)
  • 有解决方法吗?

Lie*_*yan 19

这是什么原因?

默认情况下,大多数终端都是行缓冲的,Java在换行之前不会接收输入.

它是Java的限制吗?

一些古老的终端可能只有线路缓冲输入; 虽然应该可以在大多数现代终端中禁用缓冲.

这种行为依赖于系统(我在Ubuntu上)吗?它在Mac上如何运作?视窗?

是.

它是否依赖于我运行应用程序的特定终端?(对我来说,它在Eclipse和gnome-terminal中表现得像这样)

是.

有解决方法吗?

有平台特定的黑客攻击.curse在Linux和类Unix平台中,以及Windows中的getch().我不知道任何跨平台的方式.

相关:为什么"按任意键继续"是个坏主意:

替代文字


hoa*_*at4 6

我在Ubuntu上

有解决方法吗?

Runtime.getRuntime().exec("stty -icanon min 1").waitFor();
Run Code Online (Sandbox Code Playgroud)

之后,在同一进程中对System.in的所有读取将读取1个不等待EOL的字符.