— Привет, Амиго, еще раз.
— И тебе привет, Риша. О чем будет сегодняшняя лекция?
— Сегодня я тебе расскажу про 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());
— Гм. Действительно короче. И ведь только сегодня вы мне рассказывали про все эти методы. Буду отрабатывать. Спасибо за урок, Риша.
— Удачи, Амиго.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
raw use of parameterized class List
правильно вот так Почему нас учат плохому? кому интересно почитать почему это плохо вот ссылка