Java 为什么可以';我们不能从System.in中一次读取一个字符吗?

Java 为什么可以';我们不能从System.in中一次读取一个字符吗?,java,stdin,Java,Stdin,下面的程序打印在标准中写入的每个字符,但仅在写入新行之后(至少在我的系统上!) 这可以防止人们编写诸如“按任意键继续”之类的内容,并强制执行诸如“按enter键继续”之类的内容 这背后的原因是什么 这是Java的局限性吗 这种行为依赖于系统吗(我在Ubuntu上)?它在Mac上是如何工作的?窗户 它是否取决于我运行应用程序的特定终端?(对我来说,它在Eclipse和gnome终端中的行为与此类似) 有解决办法吗 这背后的原因是什么 默认情况下,大多数终端都是行缓冲的,Java在换行之前不会接

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

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

  • 这背后的原因是什么
  • 这是Java的局限性吗
  • 这种行为依赖于系统吗(我在Ubuntu上)?它在Mac上是如何工作的?窗户
  • 它是否取决于我运行应用程序的特定终端?(对我来说,它在Eclipse和gnome终端中的行为与此类似)
  • 有解决办法吗
这背后的原因是什么

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

这是Java的局限性吗

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

这种行为依赖于系统吗(我在Ubuntu上)?它在Mac上是如何工作的?窗户

它是否取决于我运行应用程序的特定终端?(对我来说,它在Eclipse和gnome终端中的行为与此类似)

有解决办法吗

有一些特定于平台的黑客攻击<在Linux和类似Unix的平台上使用代码>诅咒,在Windows中使用getch()。我不知道有什么跨平台的方法

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

在中查看我的答案


公共静态void getCh(){

最终JFrame=新JFrame(); 同步(帧){ 框架。设置未装饰(真实); frame.getRootPane().setWindowDecorationStyle(JRootPane.frame); frame.addKeyListener(新的KeyListener(){ 按下公共无效键(按键事件e){ 同步(帧){ frame.setVisible(假); frame.dispose(); frame.notify(); } } 公开无效密钥已释放(密钥事件e){ } public void keyTyped(KeyEvent e){ } }); frame.setVisible(true); 试试{ frame.wait(); }捕获(中断异常e1){ } }
}

我在Ubuntu上

有解决办法吗


在此之后,在同一进程中对System.in的所有读取都将读取1个字符,而不是等待下线。

请参阅我的答案,除非您使用以下命令:
exec(新字符串[]{”/bin/sh“,“-c”,“stty-icanon min 1
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);
    }
}

public static void getCh() {

final JFrame frame = new JFrame(); synchronized (frame) { frame.setUndecorated(true); frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME); frame.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { synchronized (frame) { frame.setVisible(false); frame.dispose(); frame.notify(); } } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } }); frame.setVisible(true); try { frame.wait(); } catch (InterruptedException e1) { } }
Runtime.getRuntime().exec("stty -icanon min 1").waitFor();