wake-up-neo.net

Java BufferedWriter-Objekt mit utf-8

Ich habe den folgenden Code und möchte, dass der Ausgabestrom utf-8 verwendet. Grundsätzlich habe ich Zeichen wie é, die als é erscheinen, so dass es wie ein Codierungsproblem aussieht.

Ich habe viele Beispiele gesehen, die verwenden ...

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

Mein aktueller Code ist jedoch ...

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

Kann dieses Objekt als UTF-8 definiert werden, ohne den OutputStreamWriter verwenden zu müssen?

Vielen Dank,

29
david99world

Nein. FileWriter lässt Sie die Kodierung nicht angeben, was sehr ärgerlich ist. Es verwendet immer die Standardcodierung des Systems. Einfach aufsaugen und OutputStreamWriter verwenden, um eine FileOutputStream einzuwickeln. Sie können den OutputStreamWriter natürlich immer noch in einen BufferedWriter packen:

BufferedWriter out = new BufferedWriter
    (new OutputStreamWriter(new FileOutputStream(path), StandardCharsets.UTF_8));

Oder ab Java 8:

BufferedWriter out = Files.newBufferedWriter(Paths.of(path));

(Natürlich können Sie die Standardcodierung Ihres Systems in UTF-8 ändern, aber das scheint ein extremes Maß zu sein.)

116
Jon Skeet

Sie können einen verbesserten FileWriter verwenden, der von mir verbessert wurde.

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 ) );
  }
}
5

Wie die Dokumentation für FileWriter erklärt, 

Die Konstruktoren dieser Klasse gehen davon aus, dass die Standardzeichencodierung und die Standardbytepuffergröße akzeptabel sind. Um diese Werte selbst festzulegen, erstellen Sie einen OutputStreamWriter auf einem FileOutputStream. 

Es gibt keinen Grund, warum Sie Ihren BufferedWriter nicht auf dem OutputStreamWriter erstellen können.

2

Verwenden Sie die Methode Files.newBufferedWriter (Pfadpfad, Charset cs, OpenOption ...)

Wie von Toby gefordert, ist hier der Beispielcode.

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();
        }
0
Pijush