2

我正在尝试编写一些读取可能有编码错误的 UTF-8 编码文件,处理内容并将结果写入也以 UTF-8 编码的输出文件。

我的程序应该修改内容(搜索和替换的类型),然后一对一地复制所有其余内容。换句话说:如果要搜索的词等于要替换的词,则输入文件和输出文件也应该相等。

通常我使用这个代码:

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 文件中的缺陷也被一对一复制,或者加载字符的过程是否会Stringbuffer改变这一点?

4

1 回答 1

1

Java 数组不实现基于值的equals. 这将永远失败:

assertTrue( bytesf1.equals( bytesf2 ) ); 

考虑:

assertArrayEquals(bytesf1, bytesf2);

或者

assertTrue(Arrays.equals(bytesf1, bytesf2));
于 2013-09-28T08:00:07.367 回答