как поймать пустой ввод с помощью класса сканера в java

Я использую класс сканера для захвата пользовательского ввода из командной строки (только строки) в качестве альтернативы моему предыдущему вопрос.

Следующее, похоже, работает нормально, за исключением того, что пустые строки не захватываются, как должны, вторым условным оператором. Например, когда я нажимаю ввод, это должно быть захвачено как пустая строка, а второе условное выражение должно быть истинным. Однако каждый раз на консоли отображается новая пустая строка, при этом вся консоль «прокручивается» вверх, если я продолжаю нажимать ввод, а не логика в условном выражении.

Есть ли правильный способ поймать пустой ввод из командной строки с помощью сканера? (кто-то нажимает просто Enter или несколько раз нажимает пробел, а затем Enter)

Спасибо за любой совет

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

person denchr    schedule 15.11.2009    source источник
comment
Я также надеялся спросить, является ли это правильным способом чтения пользовательского ввода из командной строки. Какое обычное исключение я должен обрабатывать, например? Спасибо за любые пояснения   -  person denchr    schedule 15.11.2009
comment
Чтобы быть придирчивым, ни один из этих кодов не будет считываться из командной строки — ваши аргументы находятся в аргументах main(). Но вы говорите о стандартном вводе.   -  person Carl Smotricz    schedule 15.11.2009


Ответы (2)


Scanner - это "для чайников" реализация файлового ввода-вывода для ввода. Это позволяет авторам учебных пособий и учебников писать демонстрационный код, не жалуясь на его сложности.

Если вы действительно хотите знать, что читаете, вы должны сказать что-то вроде

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

... и тогда вы можете сделать

String line = br.readLine()

и не вижу ничего, кроме правды.

person Carl Smotricz    schedule 15.11.2009
comment
Ну, я немного не уверен, какую реализацию выбрать. В другом посте, на который я ссылаюсь выше, сканер хвалят за использование BufferedReader(new InputStreamReader(System.in)); - person denchr; 15.11.2009
comment
Ну Scanner лучше с точки зрения простоты. Это хуже с точки зрения мелкозернистого контроля. - person Carl Smotricz; 15.11.2009

выберите = br.следующий();

... блокирует, пока не найдет подходящий токен. Это означает, что он будет ждать, пока не увидит возвращаемый токен, поэтому вы не получите от него пустую строку.

Попробуйте заменить эти строки:

//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...
person Dafydd Rees    schedule 15.11.2009