undefined

BufferedReader/InputStreamReader

Java Core
9 уровень , 6 лекция
Открыта

— Привет, Амиго! Ты уже давно пользуешься классами BufferedReader и InputStreamReader. Теперь давай разберемся, что же они делают.

Класс InputStreamReader является классическим адаптером от интерфейса InputStream к интерфейсу Reader. Тут даже и добавить нечего.

Но вкратце, происходит вот что. Когда ты запрашиваешь (читаешь посредством read) у объекта типа InputStreamReader очередной символ, он читает из переданного ему в конструктор InputStream-а несколько байт и возвращает их как один char.

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

— Но у класса Reader ведь есть метод read(CharsetBuffer s), разве мы не можем использовать его?

— Этот метод читает данные куском, размер которого равен размеру буфера и помещает их в объект CharsetBuffer.

Текст обычно делится на строки (линии, line — строка по-английски). Поэтому метод read(CharsetBuffer s) может прочитать несколько «линий» за один раз. Если же нам нужно прочитать текст именно до конца «линии» (т.е. все символы строки до enter), для этого лучше поискать что-нибудь еще. И такой метод есть. В классе BufferedReader.

Класс BufferedReader, являющийся удобной надстройкой над Reader, имеет один очень удобный метод: readLine(). Этот метод позволяет читать из Reader-а сразу целыми строками (т.е. линиями). Когда ты в своем коде вызываешь метод readLine, он читает из объекта Reader символы, пока не встретится enter. Как только enter встретится, метод склеит символы в одну строку и вернет ее.

— Я этим постоянно пользовался, только не знал как все это работает. Теперь знаю. Спасибо, Ким.

Комментарии (96)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
Anonymous #2297535 22 уровень, Северодвинск
11 марта 2021

Класс BufferedReader, являющийся удобной надстройкой над Reader, имеет один очень удобный метод: readLine(). 
"Да что ты говоришь!! Да ладно!! Вау!!! Это так неожиданно!!"
Darth Nihilus 29 уровень, Казань
8 февраля 2021
gnl...
Даниил Александрович 31 уровень, Тамбов
8 февраля 2021
не вижу особого смысла в этих всех обертках. кроме как пользы от чтения utf-16 и то с натяжкой. файлы нужны для логов. для остального есть sql.
Алексей 25 уровень, Night city
3 января 2021
Если я правильно понял хочешь читать байты используй InputStream, если символы InputStreamReader, хочешь читать строками - BufferedReader.
Deniska 20 уровень, Москва
24 декабря 2020
никогда такого не было и вот опять! как же я этим пользовался не зная?
Е К 33 уровень, Краснодар
14 декабря 2020
Core близится к финалу. У кого пробелы в теории и сложности с практикой, рекомендую лекции по IO #12 - 14 от мистера Иван Головач. У парня преподавательский талант. Низкий ему поклон - разложил мне всё по полочкам)
Евгений 20 уровень, Краснодар
23 октября 2020
Этот "Enter" - обычно два символа. Один - конец строки, а второй перевод на новую строку. Здесь покачто не знаю как. Бывает просто один перевод на новую строку. Но обычно два символа. И это нужно знать разработчику работающему с символами.
Svetlana Vydrina 20 уровень
8 октября 2020
На человеческом языке ваша «линия» называется «абзац» 🤣
Станислав Бынеев 28 уровень, Москва
25 сентября 2020
Получается, что BufferedReader - обертка, а InputStreamReader - адаптер?
Николай Тараданов 30 уровень, Новосибирск
19 сентября 2020
Эта "лекция" заставила мою голову биться чаще😳