日期:2014-05-20  浏览次数:20767 次

Java控制台读取字符的问题
现在有一个问题

System.out.print("第一步 按回车键继续:");
scanner.readLine();

System.out.print("第二步 按回车键继续:");
scanner.readLine();

System.out.println("完成");


如果在第一步时候按了两下回车键,则第二步就自动跳过了。

请问我在第一步和第二步之间,如何把System.in清空?

------解决方案--------------------
弄两个线程,第一个线程显示后,做个标记,之后第二个线程读的回车才算数.
------解决方案--------------------
按了两次回车,相当于输入了两行,你的两个readLine()当然就都过了
要避免这种情况,判断一下第二个readLine()读取的不为空就行了

Java code
        Scanner scanner = new Scanner(System.in);
        System.out.print("第一步 按回车键继续:");
        scanner.nextLine();

        System.out.print("第二步 按回车键继续:");
        String l = "";
        do {
            l = scanner.nextLine();
        } while (l.length() == 0);

        System.out.println("完成");

------解决方案--------------------
呃,楼主,我现在终于理解你的需求了,但我不得不说你这是一个矛盾
你需要用户按两个回车,又不允许他一次按两个回车……
问题是没有办法从输入流(system.in)中简单的知道这两个回车是何时按下的。
可能你理所当然地认为程序的执行顺序是这样的:
打印提示->等待输入->输入两个回车->打印提示->等待输入(直接跳过了)->结束
但实际上这种情况非常不可能,一般的顺序是这样的
打印提示->等待输入->输入回车->打印提示->等待输入->输入回车->结束
原因是电脑执行速度非常快,哪怕两个回车之间的间隔只有0.01秒,对程序来说,中间的时间也足够打印第二个提示了(你调试在中间打断点的话是另一回事)

不知道楼主明白了没,即使你第一次读取后把System.in清空了,仍然不能避免这种情况,因为那时候System.in原本就已经空了,第二次输入在0.01秒以后才会到达
------解决方案--------------------
没啥好办法,自己写个scanner,处理InputStream吧。这个总是能实现的。

Scanner内置有缓冲,很麻烦。