Подтвердить что ты не робот

Объект 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?

Спасибо,

4b9b3361

Ответ 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.