HasNext() - когда он блокируется и почему?

Я пытаюсь читать команды через объект Scanner. Для проверки синтаксиса ввода я использую sc.hasNext() (для случая отсутствующих команд). Это было хорошо для многих случаев, но теперь у меня есть случай, описанный в JavaAPI как "МОЖЕТ блокировать и ждать ввода".

Когда метод hasNext() блокирует и как я могу его контролировать? Смешная вещь заключается в том, что она отлично работает с 3 случаями перед блоком. Кроме того, JavaAPI описывает hasNext() как правильный метод проверки того, есть ли другой вход или нет, так что метод next() не создает Exception.

Вот код, который я делал до сих пор:

if (sc.hasNext() && sc.next().equals("create")) {
    if (sc.hasNextInt()) {
        width = sc.nextInt();
        if (width > 0) {
            if (sc.hasNextInt()) {
                heigth = sc.nextInt();
                if (heigth > 0) {
                    if (sc.hasNext()) {  //At this point the hasNext Statement blocks for //no reason till an Input is made.
                        charset = sc.next();
                        Image = new AsciiImage(width, heigth,charset);
                    } else {
                        ret = false;
                        System.out.println("INPUT MISMATCH");
                    }
                } ...//and so on

Заранее спасибо, я не мог найти что-либо в этой теме. Изменить: Сканер определяется как System.in, но это не должно быть проблемой. По крайней мере, это не было до сих пор.

Ответ 1

Существует разница между тестированием через консоль или через TextFile. Если я прочитаю из Console, программа ожидает Stream, и он будет ожидать ввода дополнительных данных.

При тестировании через Input из текстового файла (все еще с System.in для сканера, используя программу Java) hasNext() вернет false в конце файла, поскольку дальнейший ввод не может быть выполнен.

Я не могу найти документацию (в https://docs.oracle.com/javase/9/docs/api/java/util/Scanner.html#hasNext--) в этой теме. Так что, если кто-то найдет правильный и правильный правильный ответ, я бы очень понравился.

Ответ 2

Я не уверен, но следующее - мой собственный опыт:
когда объект сканера подается с файлом, он не будет блокировать!
Под термином "поданный файлом" я подразумеваю, что сканер построен следующим образом:
Scanner scanner = new Scanner("myFile.txt");

Но если сканер построен с использованием метода getInputStream() объекта Socket, например:

input = socket.getInputStream();
Scanner scanner = new Scanner(input);

сканер будет блокироваться!

Ответ 3

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

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