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

2024-01-11

下面的程序打印标准输入上写入的每个字符,但仅在写入换行符后才打印(至少在我的系统上!)。

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);
    }
}

这可以防止人们编写“按任意键继续”之类的内容,并强制执行“按 Enter 继续”之类的内容。

  • 这背后的根本原因是什么?
  • 这是Java的限制吗?
  • 这种行为与系统相关吗(我在 Ubuntu 上)?它在 Mac 上如何工作?视窗?
  • 它取决于我运行应用程序的特定终端吗? (对我来说,它在 Eclipse 和 gnome-terminal 中的行为是这样的)
  • 有解决方法吗?

这背后的根本原因是什么?

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

这是Java的限制吗?

一些古老的终端可能只有行缓冲输入;尽管应该可以在大多数现代终端中禁用缓冲。

这种行为与系统相关吗(我在 Ubuntu 上)?它在 Mac 上如何工作?视窗?

Yes.

它取决于我运行应用程序的特定终端吗? (对我来说,它在 Eclipse 和 gnome-terminal 中的行为是这样的)

Yes.

有解决方法吗?

有一些特定于平台的技巧。curse在 Linux 和类 Unix 平台中使用 getch(),在 Windows 中使用 getch()。我不知道任何跨平台的方式。

related:为什么“按任意键继续”是个坏主意:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们不能一次从 System.in 读取一个字符? 的相关文章

随机推荐