JavaRush /Курсы /Java Core /FileReader/FileWriter

FileReader/FileWriter

Java Core
9 уровень , 4 лекция
Открыта

— Привет, Амиго! Вчера Риша рассказывал тебе про FileInputStreamFileOutputStream. А сегодня я расскажу тебе о классах FileReader и FileWriter.

Как ты уже, наверное, догадался, все эти классы являются адаптерами между объектом File и “интерфейсами” InputStreamOutputStreamReaderWriter.

— Они похожи на адаптеры между File и Reader/Writer, вот только в конструктор к ним нужно передать объект String, а не File!

— На самом деле, у них несколько конструкторов: есть и File и String. И если ты передашь в конструктор класса объект типа String, то в нем, незаметно для тебя создастся объект типа File, с путем файла, взятым из переданного String.

Это сделано для удобства. Разработчики Java взяли самые частые сценарии использования этих классов, и написали для всех их конструкторы. Это очень удобно, не так ли?

— Да, удобно, согласен. Но почему тогда мне постоянно приходится писать:
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Почему они не добавили этот сценарий?

— Дело в том, что типичная программа на Java не работает с консолью. Вернее, почти никогда ничего с нее не читает. Это может быть web-сервер, сервер приложений или еще какая-нибудь сложная система.

Но для вывода данных и текста на консоль добавили объект PrintStream. Так как те же «серверные программы» часто пишут в консоль свое состояние работы, ошибки и еще разную информацию.

— Понятно. А копировать файл с помощью FileReader и FileWriter тоже можно?

— Да, если он текстовый (т.е. состоит из символов). Вот, смотри пример:

 Копируем файл на диске
public static void main(String[] args) throws Exception
{
 FileReader reader = new FileReader("c:/data.txt");
 FileWriter writer = new FileWriter("c:/result.txt");

 while (reader.ready()) //пока есть непрочитанные байты в потоке ввода
 {
  int data = reader.read(); //читаем один символ (char будет расширен до int)
  writer.write(data); //пишем один символ (int будет обрезан/сужен до char)
 }

 //закрываем потоки после использования
 reader.close();
 writer.close();
}

— Почти никаких отличий.

— Да, отличия минимальны.

Комментарии (133)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
ShadyLine Уровень 30
13 июля 2025
как то задом наперед обучаемся...
Hack Уровень 32
17 мая 2025
как я понял BufferedReader является декоратором в конструкторе ожидает Reader а InputStreamReader является адаптером который в конструкторе ожидает InputStream таким образом превращая InputStream к Reader у
{Java_Shark} Уровень 36
10 декабря 2024
++
Денис Кокшаров Уровень 32
17 марта 2025
++Java_Shark
{Java_Shark} Уровень 36
9 декабря 2024
вроде понятно))) всем добра++
Максим Li Уровень 40
13 апреля 2024
13.04.2024
7 апреля 2024
какая смысловая нагрузка должна была быть от этой лекции?
Long_byte Уровень 21
23 марта 2024
мне один момент не понятен FileReader является адаптером между обьектом File и интерфейсами потока. то есть внутри FileReader есть приватное поле типа File и при вызове метода обьекта FileReader вызываем методы обьекта File?
Li Уровень 20
5 января 2024
05.01.2024
Dmitry Shaburov Уровень 33
1 ноября 2023
01.11.2023
Vitaly Demchenko Уровень 1
16 октября 2023
Для тестирования и тренировки регулярок установите в IDEA плагин Regexp Tester - в IDEA открыть File | Settings | Plugins | Marketplace -> Regexp Tester. После установки перезагрузите IDEA, плагин RegexTester будет добавлен в нижнюю панель. Плагин позволяет задать регулярное выражение и искать подстроки, менять их (аналог replace), если они соответствуют регулярному выражению. Для удобства включите флаг Multiline(?m) (многострочный режим) и Unicode... (?U) для работы с кириллицей.
Dmitry Vidonov Уровень 29 Expert
23 октября 2023
Кайф, спасибо)