web-dev-qa-db-ja.com

Java utf-8のBufferedWriterオブジェクト

次のコードがあり、出力ストリームでutf-8を使用するようにします。基本的に、éとして表示されるéしたがって、エンコードの問題のように見えます。

私は...を使用する例を見てきました...

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

私の現在のコードは...

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

OutputStreamWriterを使用せずにこのオブジェクトをUTF-8として定義することは可能ですか?

おかげで、

31
david99world

いいえ。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に変更することもできますが、それは少し極端な方法のようです。)

123
Jon Skeet

私が改善した、改善された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 ) );
  }
}
5

FileWriterの ドキュメント で説明されているように、

このクラスのコンストラクタは、デフォルトの文字エンコーディングとデフォルトのバイトバッファサイズが受け入れ可能であると想定しています。これらの値を自分で指定するには、FileOutputStreamでOutputStreamWriterを作成します。

ただし、OutputStreamWriterの上にBufferedWriterを構築できない理由はありません。

2

メソッドFiles.newBufferedWriter(Path path、Charset cs、OpenOption ... options)を使用します

Tobyからの要求に応じて、サンプルコードを以下に示します。

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