Могу ли я использовать как сканер, который использует InputStream, так и сам inputtream одновременно в одной и той же программе? - PullRequest
3 голосов
/ 18 января 2012

Полагаю, это входной аналог этого вопроса, который я задал некоторое время назад:

Могу ли я использовать PrintWriter и BufferedOutputStream для одного и того же выходного потока?

Q1) Мне нужно прочитать строки String и byte [] из одного и того же входного потока. Так можно ли использовать оболочку сканера, чтобы сначала прочитать строки, а затем напрямую использовать входной поток для чтения байта []? Это вызовет конфликт?

Q2) Если больше нет ссылок на объект сканера и он собирает мусор, будет ли он автоматически закрывать соединение?

В3) Если ответ на первый вопрос - да, а ответ на второй - нет, как только я закончу с чтением, мне нужно только вызвать inputtream.close (), а не Сканер, верно? (Потому что к тому времени у меня больше не будет указателя на объект сканера)

Ответы [ 2 ]

1 голос
/ 18 января 2012

Q1) Да, сканер буферизует свои входные данные, поэтому при переходе на другой поток некоторые байты, которые вы хотите, могли быть использованы.

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

Q2) Соединение будет закрыто после очистки.

Q3) Вам нужно только закрыть входной поток, так как Scanner является чистым объектом Java (иinput) Для буферизованных выходов вам нужно вызвать flush () или close (), чтобы гарантировать отправку неписанных данных.

1 голос
/ 18 января 2012

Для 1) вы всегда можете прочитать байты и преобразовать их в строку, используя выбранную кодировку. Я почти уверен, что это то, что все «читатели» под капотом.

Для 2) нет, класс Scanner не переопределяет метод finalize, поэтому я почти уверен, что он не закрывает дескриптор (и это действительно не должно). Раздел, посвященный финализаторам книги Effective Java, содержит подробное объяснение этой темы.

Для 3) закрытие Scanner автоматически закроет основной поток. Я почти уверен, что именно так почти все классы ввода / вывода обрабатывают переданный дескриптор файла / ресурса.

...