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
и другие методы блокирующего сканера оттуда.