如何清除标准输入(term)

问题描述:

如何清除Java中的标准输入(term)?如何清除标准输入(term)

历史的一点点: 我写了“反射”程序,算法很简单:

wait a random amount of time 
print "press enter" 
read line 

的一点是,如果用户错误地按下回车键时,它会被阅读,所以测试将是错误的。我的目标是纠正这个错误。 要做到这一点,我想有这样一个算法:

wait a random amount of time 
clear stdin 
print "press enter" 
read line 

但我不能找到一个方法来做到这一点。 This post似乎很有趣:available获取剩余字符的数量,skip将跳过它们。只能在纸上工作。如果通过按下多次输入键强调应用,available方法返回

,可以从该输入流中读取(或跳过)的字节数的估计值而不阻挡

因此,有时候,返回值是错误的,至少有一个回车符保留在缓冲区中,错误仍然存​​在。

This solution可以做的伎俩,但它是平台依赖,我不想成为。此外,从Java调用系统例程是一个不错的主意。

要恢复,我想清除我的程序的标准输入,但我不想关闭它,也不会阻止我的程序等待用户输入。对我来说,这似乎是一个非常基本的问题,如果答案很明显!

+0

除非您想要假设VT100代码,否则您没有太多选项。但为什么在控制台中呢?编写一个非常小的Swing应用程序 - 解决问题。 – 2013-03-27 00:00:58

我没有回答“清除stdin”。我认为这是特定操作系统,这可能甚至不值得尝试。

但是要解决您的问题,您可以使用java.util.Timer在随机时间提示用户。这将在一个单独的线程中运行。当用户最终按下输入时,检查他/她是否被提示。

下面的代码示例将在5秒后打印“Press enter”。主线程立即阻止等待用户输入,如果输入过早按下,则会这样说,因为布尔开关尚未打开。

*注意:TimerTest是I所提供的类的名称。随意将其更改为任何类名

static boolean userPrompted = false; 

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

    // Setup a 5 second timer that prompts the user and switch the userPrompted flag to true 
    // This will run in a separate thread 
    Timer timer = new Timer(false); 
    timer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      System.out.println("Press enter"); 
      synchronized(TimerTest.class) { 
       userPrompted = true; 
      } 
     } 
    }, 5000); 

    // Blocks waiting for user input 
    System.out.println("Get ready.. press enter as soon as you're prompted.."); 
    String input = new BufferedReader(new InputStreamReader(System.in)).readLine(); 

    // Check if user has been prompted 
    synchronized (TimerTest.class) { 
     if(!userPrompted) System.out.println("You pressed enter before prompted"); 
     else System.out.println("You pressed enter after prompted"); 
    } 

} 
+0

感谢您的回答。是的,应该做的工作,我想我会做到这一点。然而,正如你所说,这不是一个“清晰的终端”的答案,所以我会在等待其他选项,然后再验证你的答案。再次感谢。 – FaustXVI 2013-03-27 09:51:28