如何使用Java中的Scanner类捕获空输入

4
我正在使用扫描器类从命令行中捕获用户输入(仅限字符串),作为我的先前问题的替代方案。
以下内容似乎运行良好,但第二个条件语句未能正确地捕获空白行。例如,当我按回车键时,这应该被捕获为空行,并且第二个条件应该为真。然而,每次都会在控制台上显示一个新的空行,如果我一直按回车键,整个控制台会“向上滚动”,而不是条件中的逻辑。
是否有一种正确的方式可以使用扫描仪从命令行中捕获空输入?(某人只需按回车键,或者连续按空格几次然后按回车键)
感谢任何建议
Machine aMachine = new Machine();
String select;
Scanner br = new Scanner(System.in); 
 while(aMachine.stillInUse()){
  select = br.next();
        if (Pattern.matches("[rqRQ1-6]", select.trim())) {
        aMachine.getCommand(select.trim().toUpperCase()).execute(aMachine);
        }
        /*
         * Ignore blank input lines and simply
         * redisplay current status -- Scanner doesn't catch this
         */
        else if(select.trim().isEmpty()){
        aMachine.getStatus();

        /*
         * Everything else is treated
         * as an invalid command
         */
    else {                
            System.out.println(aMachine.badCommand()+select);
            aMachine.getStatus();
        }
    }

我也希望问一下,这是否是从命令行读取用户输入的正确方式。例如,我应该处理哪些常见异常?感谢任何解释。 - denchr
挑剔一点,这段代码不会从命令行读取 - 你的参数在main()的args中。但是你在谈论标准输入。 - Carl Smotricz
2个回答

1

Scanner 是一个针对输入文件的“入门级”I/O实现。它允许教程和教材作者编写演示代码,而不必担心其复杂性。

如果你真的想知道你正在阅读什么,你必须说出类似于

BufferedReader br = new BufferedReader(new FileReader("myfile.txt"))

...然后你可以做

String line = br.readLine()

只看到真相,不受干扰。


嗯,我有点不确定该选择哪种实现方式。在我上面链接的另一篇文章中,扫描器被赞誉为优于使用BufferedReader(new InputStreamReader(System.in)); - denchr
1
Well Scanner在简单性方面更胜一筹。但在精细控制方面则稍逊一筹。 - Carl Smotricz

0

... 这个代码块会一直等待,直到找到一个适当的令牌(token)才会返回,这意味着它将等待看到一个令牌才能返回,因此您不会从中得到一行空白。

尝试替换这些行:

//select = br.next();    // old version with Scanner

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
try {
  select = bufferedReader.readLine();
} catch (IOException e) {
  throw new RuntimeException(e);
}
System.out.println(">" + select + "<"); // should be able to see empty lines now...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接