Java BufferedWriter объект с utf-8 - PullRequest
29 голосов
/ 09 августа 2011

У меня есть следующий код, и я хочу, чтобы выходной поток использовал utf-8. В основном у меня есть такие символы, как é, которые отображаются как é, поэтому это похоже на проблему с кодировкой.

Я видел много примеров, которые используют ...

OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(path),"UTF-8");

Хотя мой текущий код ...

BufferedWriter out = new 
BufferedWriter(new FileWriter(DatabaseProps.fileLocation + "Output.xml"));

Можно ли определить этот объект как UTF-8 без использования OutputStreamWriter?

Спасибо

Ответы [ 4 ]

118 голосов
/ 09 августа 2011

Нет. 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, но это кажется крайней мерой.)

5 голосов
/ 20 сентября 2013

Вы можете использовать улучшенный 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 ) );
  }
}
2 голосов
/ 09 августа 2011

Как объясняет документация для FileWriter,

Конструкторы этого класса предполагают, что кодировка символов по умолчанию и размер байтового буфера по умолчанию приемлемы.Чтобы указать эти значения самостоятельно, создайте OutputStreamWriter для FileOutputStream.

Нет причины, по которой вы не можете создать свой BufferedWriter поверх OutputStreamWriter.

0 голосов
/ 04 июля 2018

Используйте метод, Files.newBufferedWriter (путь пути, Charset cs, OpenOption ... опции)

В соответствии с запросом Тоби, вот пример кода.

String errorFileName = (String) exchange.getIn().getHeader(HeaderKey.ERROR_FILE_NAME.getKey());
        String errorPathAndFile = dir + "/" + errorFileName;
        writer = Files.newBufferedWriter(Paths.get(errorPathAndFile),  StandardCharsets.UTF_8, StandardOpenOption.CREATE_NEW);
        try {
            writer.write(MESSAGE_HEADER + "\n");
        } finally {
            writer.close();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...