2016-07-13 7 views
-1

1バイトのエンコーディングでテキストファイルに文字ストリームを書き込みます。 ストリーム内のマップできない文字を検出してフォールバックアクション(高レベルで、無効な文字を削除または置換しない)を行うことができるようにしたいと考えています。ストリーム内のマップできない文字を検出します。

私は今OutputStreamWriterを使用していますが、マッピングの失敗が発生することはありますか?

private void convert(Iterable<String> lines, OutputStream os) throws CoreException, IOException { 
    String lineDelimiter = ResourcesUtils.getLineDelimiter(file.getProject()); 
    Charset charset = Charset.forName(file.getCharset()); 
    CharsetEncoder encoder = charset.newEncoder(); 
    encoder.onUnmappableCharacter(CodingErrorAction.REPORT); 
    try (OutputStreamWriter writer = new OutputStreamWriter(os, encoder)) { 
     Joiner.on(lineDelimiter).appendTo(writer, lines); 
    } 
} 

このコードは、サンプル無効な入力に投げたが、のOutputStreamWriterまたは入力の他の実装でそうすることが保証されている場合、それは不明です。

マップできない文字を含むストリームを変換する際に例外を取得するにはどうすればよいでしょうか?

+0

試しましたか?無効なデータを入力したときに何が起こったのですか? –

+0

私はうまく働いていましたが、** GuavaのJoiner **は使用しませんでした。多分それが原因です。 –

答えて

0

さまざまなコンストラクタでOutputStreamWriterを構築しようとしましたが、書き込み時にummappable入力を投げるかどうかをテストしました。 createWriter()実装以下で

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
Writer writer = createWriter(outputStream); 
writer.write("ホク"); 
writer.close(); 

一般的なテストケースは、ように見えた

  • new OutputStreamWriter(outputStream, "windows-1251")を -
  • new OutputStreamWriter(outputStream, Charset.forName("windows-1251"))をスローしません - スローしません
  • 設定されたエンコーダ:

    CharsetEncoderエンコーダ= Charset.forName( "windows-1251")。newEncoder(); encoder.onUnmappableCharacter(CodingErrorAction.IGNORE); ; 新しいOutputStreamWriter(出力ストリーム、エンコーダ)。この動作は少し驚くべきことであり、is not specifiedある

投げるん -

  • new OutputStreamWriter(outputStream, Charset.forName("windows-1251").newEncoder())がスローされません。 さらにドキュメントは言う:

    このクラスは、常に不正なサロゲート要素と文字セットのデフォルトの置換配列とマップできない 文字列に置き換えられます。 エンコーディング処理をより詳細に制御する必要がある場合は、CharsetEncoderクラスを使用する必要があります。

    最後の実験結果と矛盾します。一般的に、Javaの(TM)SEランタイム環境(1.8.0_72-B15を構築)する(Linux)

    のOutputStreamWriterでテスト

    は、マッピングの失敗にスローされませんんが、時にはそれはありません。生のCharsetEncoder APIはストリームに適していないため、まだ使用しますが、より堅牢なソリューションを歓迎します。

  • 関連する問題