2013-09-21 67 views
0

我寫了一些代碼來處理由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);進行比較),它們將在控制檯上打印出來。在上面的圖片下面的圖片是原始圖片,下面的圖片被複制。

console out

正如人們所看到的,沒有明顯的區別。失敗僅在插入二進制數據的行上發生,而不是在每個行上。

所以我的問題: 如何安全地讀取和寫入這些行?我還需要以字符串的形式訪問文件的內容,以便對它運行一些正則表達式,因此不能逐字節地拷貝,或者至少我不知道如何對其進行編碼。

在此先感謝...

編輯

嗯,我認爲看文件是爲失敗的唯一原因,但事實證明,我想這也是寫作。

我取代用於讀取的代碼由亨利爲建議:

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

在這個文件是什麼結果:該文件的其餘部分似乎

error writing

正如人們可以成像,前兩行是正確的,是錯誤。我該如何解決這個問題,換句話說:讀取一個UFT-8編碼的文件並將其編寫爲UTF-8編碼的文件?

在此先感謝!

回答

4

由於存在二進制內容,因此將文件作爲字節讀取而不是作爲字符讀取。這意味着,請勿使用Reader,而應使用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); 
} 
+0

這聽起來不錯,但你能可能爲我提供一些示例代碼? – philipp

+0

這是正確的。 philipp使用的InputStreamReader使用系統的默認字符集,它可以與數據的字符集不同。 – Ridcully

+0

非常感謝!我會嘗試! – philipp