unblocked scanner java功能

时间:2014-07-28 12:21:14

标签: java

我想询问用户是否可以在继续之前按键。然后我的程序将在10秒内等待。 如果没有做任何事情,那么,我希望能够退出该计划。

我的问题是功能扫描器会阻止我的程序(直到用户按下某个键)并且不允许程序执行结束。

您是否知道我可以做什么/使用什么而不是扫描仪?我只是java的初学者,所以请放纵我。

import java.util.Scanner;

public class Test{
    public Test(){
        Scanner scan = new Scanner(System.in);
         boolean first = true;
         System.out.println("Press any key to start.\n"); 
        for(int fr = 0; fr <11; fr++){
            System.out.println(fr);
                try{
                    Thread.sleep(1000);

                } catch (Exception e) {
                    System.err.println("error -> "+e.getMessage()); // in case of exception, error message
                }
        if(fr == 10){
            Default def = new Default();
        }else if(scan.hasNext() == true){
            //System.out.println("Hello");
            User user = new User(); // or exit, it doesn't matter
        }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

使用KeyListener

首先制作一个Component,给它焦点,然后添加一个KeyListener。

示例代码:

Component comp = new Componenet();
comp.addKeyListener(new KeyListener() {
    public void keyTyped(KeyEvent e) {
        System.out.print("Hello");
    }

    public void keyPressed(KeyEvent e) {}
    public void keyReleased(KeyEvent e) {}
});

try {
    Thread.sleep(1000);
} catch (Exception e) {
}
System.exit(0);

答案 1 :(得分:0)

可能的解决方案是使用不同的线程来读取扫描仪的用户输入。这是一个示例代码:

Scanner scanner = new Scanner(System.in);
ExecutorService scannerExecutor = Executors.newSingleThreadExecutor();
Future<String> nextLineFuture = scannerExecutor.submit(scanner::nextLine);
/* For Java < 8:
Future<String> nextLineFuture = scannerExecutor.submit(new Callable<String>() {
    @Override
    public String call() throws Exception {
        return scanner.nextLine();
    }
});
 */

String input;
try {
    input = nextLineFuture.get(5, TimeUnit.SECONDS);
}
catch (TimeoutException e) {
    input = "Nothing was entered";
}
catch (InterruptedException | ExecutionException e) {
    // Handle the exception
    return;
}

System.out.println(input);

但是,您需要记住以下问题:

  • 即使nextLineFuture.get(...)抛出TimeoutExceptionnextLine电话仍会继续投放。如果稍后再次运行scannerExecutor.submit(scanner::nextLine),则输入将首先被前一次调用消耗,因此您应确保引用最后创建的结果尚未使用的Future。< / p>

  • 由于上述问题,如果您需要使用不同的扫描仪方法,例如nextBooleannextInt等,此方法将无效。但是,您可以始终使用{{ 1}}在主扫描仪上,然后手动解析该行(例如,使用另一台扫描仪)