我寫了一些代碼來處理由mysql轉儲生成的文件。有一件事留給我不知道如何正確解決:java二進制插入不是一對一複製
讀取文件我用這個代碼:
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);
進行比較),它們將在控制檯上打印出來。在上面的圖片下面的圖片是原始圖片,下面的圖片被複制。
正如人們所看到的,沒有明顯的區別。失敗僅在插入二進制數據的行上發生,而不是在每個行上。
所以我的問題: 如何安全地讀取和寫入這些行?我還需要以字符串的形式訪問文件的內容,以便對它運行一些正則表達式,因此不能逐字節地拷貝,或者至少我不知道如何對其進行編碼。
在此先感謝...
編輯
嗯,我認爲看文件是爲失敗的唯一原因,但事實證明,我想這也是寫作。
我取代用於讀取的代碼由亨利爲建議:
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編碼的文件?
在此先感謝!
這聽起來不錯,但你能可能爲我提供一些示例代碼? – philipp
這是正確的。 philipp使用的InputStreamReader使用系統的默認字符集,它可以與數據的字符集不同。 – Ridcully
非常感謝!我會嘗試! – philipp