Reader, Writer

Java Collections
1 уровень , 7 лекция
Открыта

— Привет, Амиго, еще раз.

— И тебе привет, Риша. О чем будет сегодняшняя лекция?

— Сегодня я тебе расскажу про Reader и Writer.

— Но, Риша, я же уже почти все о них знаю!

— Повторение — мать учения.

— Гм. Ну, ок.

— Reader и Writer – это аналоги InputStream и OutputStream, но в отличие от них, они работают не с байтами, а с символами. Иногда их еще называют символьными потоками, в противовес InputStream и OutputStream – байтовым потокам.

— Один символ – два байта, я помню.

— Дело не только в этом. Эти классы специально ориентированы для работы с текстом и строками. Сегодня мы рассмотрим две классические реализации этих абстрактных классов – классы FileReader и FileWriter.

Вот методы класса FileReader:

Метод Описание
int read() Читает один символ из потока и возвращает его.
int read(char cbuf[], int offset, int length) Читает массив символов, возвращает количество прочитанных символов.
boolean ready() Возвращает true, если из потока еще можно читать.
void close() Закрывает поток для чтения.
int read(java.nio.CharBuffer target) Читает набор символов в буфер.
int read(char cbuf[]) Читает массив символов.
long skip(long n) Пропускает n символов в потоке.
String getEncoding() Возвращает текущую кодировку потока.

— Ну, я почти все это знаю. А FileWriter?

Метод Описание
void write(int c) Пишет один символ в поток.
void write(char cbuf[], int off, int len) Пишет массив символов в поток.
void write(char cbuf[]) Пишет массив символов в поток.
void write(String str, int off, int len) Пишет часть строки в поток.
void write(String str) Пишет строку в поток.
void flush() Записывает на диск, все для оптимизации хранится в памяти.
void close() Закрывает поток.
String getEncoding() Возвращает текущую кодировку потока.

И это знаю!

— Да, но это же отлично. Тогда давай разберем один интересный пример, а Диего потом даст тебе еще задач.

Как прочитать файл построчно? Сможешь написать код?

— Легко, смотри:

Код
//создаем список для хранения строк
List<String> list = new ArrayList<String>(); 

// открываем файл
File file = new File("c:/document.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));

//пока файл не пуст – читаем из него
while (reader.ready())
{
 list.add(reader.readLine());
}

//закрываем файл
reader.close();

— Гм. Неплохо.

— Неплохо? Да тут все просто и красиво. Признайся, Риша, что я уже отлично владею потоками ввода-вывода. Ну что тут можно улучшить-то?

— Ну, например, можно сделать так:

Код Ришы
File file = new File("c:/document.txt");

List list = Files.readAllLines(file.toPath(), Charset.defaultCharset());

— Гм. Действительно короче. И ведь только сегодня вы мне рассказывали про все эти методы. Буду отрабатывать. Спасибо за урок, Риша.

— Удачи, Амиго.

Комментарии (64)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анна Уровень 33
26 декабря 2024
кхм, я точно в квесте про коллекции?
SomeBody098 Уровень 51
10 сентября 2024
62 комментария
Евгений N Уровень 23
20 ноября 2023
почему Java не делает оптимизацию "под капотом" как все нормальные языки. замучился уже узнавать как одно и то же 10-ю способами сделать.
Andrew Karev Уровень 51
10 мая 2024
В java как раз-таки чаще всего можно сделать определённую вещь только одним способом, это была одна из целей при создании языка. Этим java отличается от более низкоуровневых языков, таких как C
Maria Уровень 41
10 августа 2023
Я вот не могу понять почему в примерах до сих пор используют класс File , ведь можно сразу создавать с помощью Files и не переводить потом через метод toPath. Учили бы сразу правильно
Popka Уровень 24
20 июля 2023
Лекция: вот вам один метод, который вы и сами могли посмотреть в idea Практика: 100500 задач с 900+ новыми методами и классами Обучение превратилось в: вот тебе серебряная монетка иди купи небоскреб. А за что тогда деньги платить?
StrangeAngel Уровень 46
18 апреля 2023
Отличная лекция, ещё бы задачи под стать были, а то такое чувство они понатыканы чтобы поиздеваться над нами.
Зета Медведя Уровень 45
27 ноября 2022
Нет слов, одни эмоции
Anonymous #3091828 Уровень 51
25 ноября 2022
Боже мой, да сколько можно уже про потоки чтения и записи.
BlackGrizzli Team Уровень 46
29 января 2023
Ну как бы я только в этом квесте осознанно понял, как писать и читать через буффер)

 char[] buffer = new char[1000];
        int length = 0;
        while ((length = bf.read(buffer)) > 0){
            bw.write(buffer,0,length);
        }
Типо такого
Daniel Уровень 51
25 февраля 2023
InputStream.transferTo(OutputStream out) - реализация того же самого из коробки. Пользуюсь начиная с синтаксиса, но валик его не воспринимает к сожалению(
апецт Уровень 50
8 сентября 2022
сколько раз я еще буду это читать?
Гэндальф Уровень 31
14 марта 2023
Да.
Станислав Future Уровень 39
27 июля 2022
Мне не меньше Амиго стало интересно, что тут можно улучшить. Удивили, удивили..