— Привіт, Аміго! Вчора Ріша розповідав тобі про FileInputStream, FileOutputStream. А сьогодні я розповім тобі про класиFileReader і FileWriter.
Як ти вже, напевно, здогадався, всі ці класи є адаптерами між об'єктом File та “інтерфейсами” InputStream, OutputStream, Reader, 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();
}
— Майже ніяких відмінностей.
— Так, відмінності мінімальні.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ