Объект Java BufferedWriter с utf-8
У меня есть следующий код, и я хочу, чтобы выходной поток использовал utf-8. В основном у меня есть символы типа é
, которые отображаются как é
, поэтому он выглядит как проблема с кодировкой.
Я видел множество примеров, которые используют...
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(path),"UTF-8");
Мой текущий код, хотя...
BufferedWriter out = new
BufferedWriter(new FileWriter(DatabaseProps.fileLocation + "Output.xml"));
Можно ли определить этот объект как UTF-8 без использования OutputStreamWriter?
Спасибо,
Ответы
Ответ 1
Нет. FileWriter
не позволяет указывать кодировку, что крайне раздражает. Он всегда использует системную кодировку по умолчанию. Просто сосать его и использовать OutputStreamWriter
обертывание FileOutputStream
. Конечно, вы можете поместить OutputStreamWriter в BufferedWriter:
BufferedWriter out = new BufferedWriter
(new OutputStreamWriter(new FileOutputStream(path), StandardCharsets.UTF_8));
Или с Java 8:
BufferedWriter out = Files.newBufferedWriter(Paths.of(path));
(Конечно, вы можете изменить кодировку по умолчанию для системы UTF-8, но это кажется немного экстремальным.)
Ответ 2
Вы можете использовать улучшенный FileWriter, улучшенный мной.
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
/**
* Created with IntelliJ IDEA.
* User: Eugene Chipachenko
* Date: 20.09.13
* Time: 10:21
*/
public class BufferedFileWriter extends OutputStreamWriter
{
public BufferedFileWriter( String fileName ) throws IOException
{
super( new FileOutputStream( fileName ), Charset.forName( "UTF-8" ) );
}
public BufferedFileWriter( String fileName, boolean append ) throws IOException
{
super( new FileOutputStream( fileName, append ), Charset.forName( "UTF-8" ) );
}
public BufferedFileWriter( String fileName, String charsetName, boolean append ) throws IOException
{
super( new FileOutputStream( fileName, append ), Charset.forName( charsetName ) );
}
public BufferedFileWriter( File file ) throws IOException
{
super( new FileOutputStream( file ), Charset.forName( "UTF-8" ) );
}
public BufferedFileWriter( File file, boolean append ) throws IOException
{
super( new FileOutputStream( file, append ), Charset.forName( "UTF-8" ) );
}
public BufferedFileWriter( File file, String charsetName, boolean append ) throws IOException
{
super( new FileOutputStream( file, append ), Charset.forName( charsetName ) );
}
}
Ответ 3
Как поясняет документация для FileWriter,
Конструкторы этого класса предполагают, что стандартная кодировка символов и размер байтового байта по умолчанию приемлемы. Чтобы сами определить эти значения, создайте OutputStreamWriter в FileOutputStream.
Нет причин, по которым вы не можете создать BufferedWriter поверх OutputStreamWriter.