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