— Привет, Амиго! Вчера Риша рассказывал тебе про 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 = 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();
}
— Почти никаких отличий.
— Да, отличия минимальны.