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

— І тобі привіт, Ріша. Про що буде сьогоднішня лекція?

— Сьогодні я тобі розповім про 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 = новий File("c:/document.txt");
BufferedReader reader = новий BufferedReader(new FileReader(file));

//поки файл не порожній - читаємо з нього
while (reader.ready())
{
 list.add(reader.readLine());
}

//закриваємо файл
reader.close();

— Гм. Непогано.

— Не погано? Та тут все просто та красиво. Зізнайся, Ріша, що я вже добре володію потоками введення-виводу. Ну що тут можна покращити?

— Наприклад, можна зробити так:

Код Ріші
File file = new File("< span class="text-green">c:/document.txt");

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

— Гм. Справді коротше. І тільки сьогодні ви мені розповідали про всі ці методи. Відпрацьовуватиму. Дякую за урок, Ріша.

— Успіхів, Аміго.