0

我写了一些代码来处理由 mysql dump 生成的文件。还有一件事我不知道如何正确解决:

要读取文件,我使用以下代码:

BufferedReader reader = 
    new BufferedReader( 
        new InputStreamReader( 
            new FileInputStream( in.toFile() ) ) );

String line;
StringBuffer buffer = new StringBuffer();

while( ( line = reader.readLine() ) != null )
{
    buffer.append( line );
    buffer.append( System.lineSeparator() );

    //here goes more code
}

第一个丑陋的事情是通过使用发生的,buffer.append( System.lineSeparator() );但这不是整体问题,看起来像这样:我编写了一个测试,如果行不相等(比较通过line1.equals( line2 );) 它们被打印在控制台上。上图下方是原图,下图是复制的。

安慰出来

可以看出,没有明显的区别。故障仅发生在插入二进制数据的行上,而不是每一行。

所以我的问题是:我怎样才能安全地读写这些行?我还需要以字符串的形式访问文件的内容以对其运行一些正则表达式,因此不能选择逐字节复制,或者至少我不知道如何对其进行编码。

在此先感谢...</p>

编辑

好吧,我认为读取文件是失败的唯一原因,但事实证明,我想这也是写作。

我按照亨利的建议将阅读代码替换为:

InputStream inStream = new FileInputStream( in.toFile() );
byte[] byteBuffer = new byte[4096];
int byteLength;

StringBuffer buffer = new StringBuffer();

while( ( byteLength = inStream.read( byteBuffer ) ) > 0 )
{
    buffer.append( new String( byteBuffer, "UTF-8" ) );
    //more code here
}

结果,比较错误仍然发生,但发生在不同的行上。要编写新文件,我使用以下代码:

BufferedWriter writer = new BufferedWriter( 
                            new OutputStreamWriter(
                                new FileOutputStream( out.toFile() ), 
                                   Charset.forName( "UTF-8" ) ) );

//while reading
writer.write( buffer.toString() );

//after reading
writer.close();

这个文件的结果是什么:

错误写入

正如人们可以想象的那样,前两行是正确的,文件的其余部分似乎是错误的。我该如何解决这个问题,或者换句话说:读取 UFT-8 编码文件并将其写入为 UTF-8 编码文件?

提前致谢!

4

1 回答 1

4

由于存在二进制内容,因此将文件读取为字节而不是字符。这意味着,不要使用 aReader而是使用 an InputStream

将字节转换为文本时,只要字节序列不是正确的字符编码,就会出错。

也许是这样的:

InputStream in = new FileInputStream( in.toFile() );
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[4096];
int len;
while ((len = in.read(buf)) > 0) {
    out.write(buf,0,len);
}
于 2013-09-21T13:22:33.360 回答