エンコーディング エラーが発生する可能性がある UTF-8 でエンコードされたファイルを読み取り、コンテンツを処理し、結果を UTF-8 でエンコードされた出力ファイルに書き込むものを書き込もうとしています。
私のプログラムはコンテンツを変更し (一種の検索と置換)、残りのすべてを 1 対 1 でコピーする必要があります。つまり、検索する用語が置換する用語と等しい場合、入力ファイルと出力ファイルも等しくなければなりません。
通常、私はこのコードを使用しています:
in = Paths.get( <filename1> );
out = Paths.get( <filename2> );
Files.deleteIfExists( out );
Files.createFile( out );
CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder();
decoder.onMalformedInput( CodingErrorAction.IGNORE );
decoder.onUnmappableCharacter( CodingErrorAction.IGNORE );
BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream( this.in.toFile() ), decoder ) );
CharsetEncoder encoder = StandardCharsets.UTF_8.newEncoder();
encoder.onMalformedInput( CodingErrorAction.IGNORE );
encoder.onUnmappableCharacter( CodingErrorAction.IGNORE );
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream( this.out.toFile() ), encoder) );
char[] charBuffer = new char[100];
int readCharCount;
StringBuffer buffer = new StringBuffer();
while( ( readCharCount = reader.read( charBuffer ) ) > 0 )
{
buffer.append( charBuffer, 0, readCharCount );
//here goes more code to process the content
//buffer must be written to output on each iteration
}
writer.write( buffer.toString() );
reader.close();
writer.close();
しかし、それは機能していません。ファイルを比較するために、失敗するこの小さな JUnit テストがあります。
byte[] bytesf1 = Files.readAllBytes( Paths.get( <filename1> ) );
byte[] bytesf2 = Files.readAllBytes( Paths.get( <filename2> ) );
assertTrue( bytesf1.equals( bytesf2 ) );
私は何を間違っていますか、またはこれを機能させるために何ができますか?
よろしくお願いします、フィリップ
編集
入力ファイルが UTF-8 でエンコードされていることを確認した後にテストを機能させることができなければ、基本的なエラーは何でしたか。私の本当の関心と質問は次のとおりです。
上記のアプローチは、UTF-8 ファイルの欠陥も 1 対 1 でコピーされることを保証しますか?それとも、文字を a にロードするプロセスがStringbuffer
これを変更しますか?