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

Як ти вже, напевно, здогадався, всі ці класи є адаптерами між об'єктом File та “інтерфейсами” InputStreamOutputStreamReader, Writer.

— Вони схожі на адаптери між 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 = новий 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();
}

— Майже ніяких відмінностей.

— Так, відмінності мінімальні.