FileWriter
обычно не является приемлемым классом для использования.Он не позволяет вам указать Charset
, который будет использоваться для записи, что означает, что вы застряли с любой кодировкой по умолчанию платформы, на которой вы работаете.Излишне говорить, что это делает невозможным последовательное использование одной и той же кодировки для чтения и записи текстовых файлов и может привести к повреждению данных.
Вместо использования FileWriter
, вы должны заключить FileOutputStream
вOutputStreamWriter
.OutputStreamWriter
позволяет вам указать кодировку:
File file = ...
OutputStream fileOut = new FileOutputStream(file);
Writer writer = new BufferedWriter(new OutputStreamWriter(fileOut, "UTF-8"));
Чтобы использовать PrintWriter
с вышеприведенным, просто оберните BufferedWriter
в PrintWriter
:
PrintWriter printWriter = new PrintWriter(writer);
Вы могли бы также просто использовать конструктор PrintWriter
, который принимает File
и имя набора символов:
PrintWriter printWriter = new PrintWriter(file, "UTF-8");
. Это прекрасно работает в вашей конкретной ситуации и фактически делаетто же самое, что и код выше, но полезно знать, как создать его, обернув различные части.
Другие типы Writer
в основном предназначены для специального использования:
StringWriter
- это просто Writer
, который можно использовать для создания String
.CharArrayWriter
то же самое для char[]
. PipedWriter
для трубопровода к PipedReader
.
Редактировать:
Я заметил, что вы прокомментировали другой ответ о многословности создания писателя таким образом.Обратите внимание, что есть библиотеки, такие как Guava , которые помогают уменьшить многословность общих операций.Возьмем, к примеру, запись String
в файл определенной кодировки.С помощью Guava вы можете просто написать:
Files.write(text, file, Charsets.UTF_8);
Вы также можете создать BufferedWriter
следующим образом:
BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8);