Буферизация с помощью сканера на System.in в Java
У меня проблема со сканером в Java. У меня есть метод разбора System.in
и создание объекта базируется на этих данных. Но если я создам Scanner
внутри метода у меня есть 2 способа сделать это, то есть с закрытием и без. В первом случае Scanner.close()
закрывается System.in
Кроме того, в противном случае он буферизуется заранее, и буферизованные символы становятся недоступными для другого сканера. Так что теперь я прохожу Scanner
экземпляр в метод. Но это не может быть надежно, если вам нужно прочитать с консоли другой объект, например, через BufferedReader
, Кроме того, кажется, что это не совсем чистое дизайнерское решение.
2 ответа
Определить BufferedReader
и передать его вашим методам. Используйте его, чтобы прочитать строки в строку и прикрепить Scanner
к этому вместо System.in
,
Я предполагаю, что дизайн считал, что только один Reader
или же Scanner
действительно может прочитать InputStream
(System.in
) за один раз, поэтому, имея несколько Reader
s на нем бесполезен (поскольку он также потребляет поток), что делает возможным закрыть базовый InputStream
,
Изменить: одно из решений заключается в использовании InputStream
напрямую (read()
) и обработать чтение байтов самостоятельно. Например String
имеет конструктор String(byte[])
что вы можете использовать вместе с substring()
вернуть только те части, которые не были использованы.