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

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

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

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

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