0

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

一点点历史:我正在写一个“反射”程序,算法很简单:

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

关键是,如果用户误按了回车键,它将被读取,因此测试将出错。我的目标是纠正这个错误。为此,我想要一个这样的算法:

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

但我找不到办法做到这一点。这篇文章似乎很有趣:available获取剩余字符的数量skip并将跳过它们。只在纸上工作。如果您通过多次按下回车键来强调应用程序,则该available方法返回

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

所以,有时,返回值是错误的,至少一个回车留在缓冲区中,错误仍然存​​在。

这个解决方案可能会奏效,但它依赖于我不想成为的平台。此外,从 Java 调用系统例程是一个非常糟糕的主意。

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

4

1 回答 1

1

我没有“清除标准输入”的答案。我认为这是特定于操作系统的,甚至可能不值得尝试。

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

下面的代码示例将在 5 秒后打印“Press enter”。主线程立即阻塞等待用户输入,如果输入太早,它会这样说,因为布尔开关还没有打开

*注意:TimerTest 是我摆弄的类的名称。随意将其更改为您的班级名称

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

}
于 2013-03-27T00:21:13.160 回答