В решении @ Voo есть ошибка, поскольку nextLine()
на keyInput
также может возвращать null
. Вот исправленная версия:
String line;
while ((line = keyInput.readLine()) != null &&
!line.trim().equals("BYE")) {
oStream.println(line);
answer = iStream.readLine();
if (answer != null) {
System.out.println(answer);
}
}
Могу ли я заменить логику, в которой указанная переменная отображается на hasNextLine()
, когда ожидается ввод данных с консоли, или я могу использовать hasNextLine()
, только если ввод поступает из файла?
Вы можете обернуть любой InputStream
или любой Readable
(из которых Reader
является подтипом) в Scanner
, что позволяет вам использовать hasNextLine()
на всех них. Единственное предостережение в том, что hasNextLine()
потенциально может блокировать неограниченное время ожидания ввода, если основной поток поступает из консоли, канала, сокета или аналогичного устройства.
Какой лучший способ реализации этого кода, когда ввод поступает из консоли, с использованием переменной done
или hasNextLine()
?
Любой из них подойдет, как и третий вариант, как показано выше. Это действительно вопрос вкуса ... и то, что вы думаете, выглядит проще всего. (Лично я бы не использовал Scanner
просто , чтобы я мог позвонить hasNextLine()
... но это только мое мнение.)
Другое существенное различие между использованием Scanner
и BufferedReader
заключается в том, что Scanner
скрывает любые IOException
s, которые могут возникнуть при вызове hasNext...()
, и возвращает просто false
. Это хорошо для типичных сценариев использования Scanner
в качестве облегченного синтаксического анализатора пользовательского ввода (как вы используете его на keyInput
), но, возможно, не в других случаях использования.