Reader, Writer

Открыта

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

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

— Сегодня я тебе расскажу про 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());

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

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

Комментарии (60)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Анна
Уровень 33
26 декабря 2024, 08:49
кхм, я точно в квесте про коллекции?
SomeBody098веник в бане
10 сентября 2024, 15:50
62 комментария
Евгений N
Уровень 23
20 ноября 2023, 22:14
почему Java не делает оптимизацию "под капотом" как все нормальные языки. замучился уже узнавать как одно и то же 10-ю способами сделать.
Andrew Karev
Уровень 51
10 мая 2024, 07:37
В java как раз-таки чаще всего можно сделать определённую вещь только одним способом, это была одна из целей при создании языка. Этим java отличается от более низкоуровневых языков, таких как C
Maria
Уровень 41
10 августа 2023, 09:05
Я вот не могу понять почему в примерах до сих пор используют класс File , ведь можно сразу создавать с помощью Files и не переводить потом через метод toPath. Учили бы сразу правильно
Popka
Уровень 24
20 июля 2023, 04:56
Лекция: вот вам один метод, который вы и сами могли посмотреть в idea Практика: 100500 задач с 900+ новыми методами и классами Обучение превратилось в: вот тебе серебряная монетка иди купи небоскреб. А за что тогда деньги платить?
StrangeAngel
Уровень 46
18 апреля 2023, 10:19
Отличная лекция, ещё бы задачи под стать были, а то такое чувство они понатыканы чтобы поиздеваться над нами.
Зета МедведяРаботает в Вселенной
27 ноября 2022, 05:56
Нет слов, одни эмоции
Anonymous #3091828
Уровень 51
25 ноября 2022, 22:24
Боже мой, да сколько можно уже про потоки чтения и записи.
BlackGrizzli Team
Уровень 46
29 января 2023, 15:54
Ну как бы я только в этом квесте осознанно понял, как писать и читать через буффер)
char[] buffer = new char[1000];
       int length = 0;
       while ((length = bf.read(buffer)) > 0){
           bw.write(buffer,0,length);
       }
Типо такого
DanielCEO в BicycleInventionAcad
25 февраля 2023, 06:41
InputStream.transferTo(OutputStream out) - реализация того же самого из коробки. Пользуюсь начиная с синтаксиса, но валик его не воспринимает к сожалению(
апецт
Уровень 44
8 сентября 2022, 08:18
сколько раз я еще буду это читать?
Гэндальф Серый Маг
14 марта 2023, 20:18
Да.
Станислав Future
Уровень 39
27 июля 2022, 13:26
Мне не меньше Амиго стало интересно, что тут можно улучшить. Удивили, удивили..