java―;二进制插入不会一对一地复制

java―;二进制插入不会一对一地复制,java,io,Java,Io,我已经编写了一些代码来处理mysql转储生成的文件。还有一件事我不知道如何正确修复: 要读取文件,我使用以下代码: BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( in.toFile() ) ) ); String line; StringBuffer buffer = new StringBuffer(); w

我已经编写了一些代码来处理mysql转储生成的文件。还有一件事我不知道如何正确修复:

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

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
}
BufferedWriter writer = new BufferedWriter( 
                            new OutputStreamWriter(
                                new FileOutputStream( out.toFile() ), 
                                   Charset.forName( "UTF-8" ) ) );

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

//after reading
writer.close();
第一件难看的事情是使用
buffer.append(System.lineSeparator())但这不是总体问题,看起来是这样的:我编写了一个测试,逐行比较输入和输出文件(由我的程序生成),如果行不相等(通过
line1.equals(line2);
比较),它们会在控制台上打印出来。上面一行下面的图像是原始图像,下面一行是复制图像

正如人们所看到的,没有明显的区别。故障仅发生在插入二进制数据的行上,而不是每一行上

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

先谢谢你

编辑

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

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

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
}
因此,比较错误仍然会发生,但会发生在不同的行上。要编写新文件,我使用以下代码:

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
}
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编码文件写入


提前谢谢

因为有二进制内容,所以以字节而不是字符的形式读取文件。这意味着,不要使用
读取器
,而是使用
输入流

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

也许是这样的:

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);
}

因为有二进制内容,所以以字节而不是字符的形式读取文件。这意味着,不要使用
读取器
,而是使用
输入流

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

也许是这样的:

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);
}

听起来不错,但是你能给我提供一些示例代码吗?没错。philipp使用的InputStreamReader使用系统的默认字符集,这可能与数据的字符集不同。非常感谢!我要试试看!非常感谢,你的回答让我走上了正确的道路。我的工作解决方案使用一个char[]和一个reader。解决编码问题的关键是连接到CharsetDecoder/CharsetEncoder…听起来不错,但是你能给我提供一些示例代码吗?这是正确的。philipp使用的InputStreamReader使用系统的默认字符集,这可能与数据的字符集不同。非常感谢!我要试试看!非常感谢,你的回答让我走上了正确的道路。我的工作解决方案使用一个char[]和一个reader。解决编码问题的关键是连接到CharsetDecoder/CharsetEncoder…