Хорошо, так как вы спрашиваете.
Writer - абстрактный класс, в котором конкретные реализации позволяют писать символы / строки.В отличие от необработанных байтов, которые делают реализации OutputStream.
FileWriter - конкретная реализация, которая позволяет записывать в файл.Слабость: кодировка символов жестко запрограммирована в качестве локали по умолчанию, например, обычно Windows-1252 в Windows и UTF-8 в Linux.
Чтобы преодолеть это, многие начинают с OutputStream (может быть, FileOutputStream), а затем преобразовать его в Writer, используя OutputStreamWriter, потому что конструктор позволяет установить кодировку.
Пример:
OutputStream os = new FileOutputStream("turnip");
Writer writer = new OutputStreamWriter(os,"UTF-8");
writer.write("This string will be written as UTF-8");
Теперь с OutputStreams / Writers (и их обратнымиклассы InputStream / Readers), это часто полезно для того, чтобы обернуть вокруг них BufferedWriter.
продолжение примера
writer=new BufferedWriter(writer);
writer.write("Another string in UTF-8");
Что это делает?BufferedWriter в основном обеспечивает буфер памяти.Все, что вы пишете, сначала сохраняется в памяти, а затем записывается по мере необходимости на диск (или куда угодно).Это часто обеспечивает значительное улучшение производительности.Чтобы продемонстрировать это, просто создайте цикл, скажем, 100 000 записей без BufferedWriter, измерьте его и сравните с версией Buffered.