2012-07-24 70 views
2

我有以下代碼:錯誤寫入ASCII字符到的java /文件機器人

private char[] headerToWrite; 
protected String workingFileName; 

private void writeHeaderToFile() 
{ 
    try 
    { 
     String completeFile = new String(headerToWrite); 

     File myFile = new File(workingFileName); 

     FileOutputStream fOut = new FileOutputStream(myFile); 

     OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut); 

     myOutWriter.append(completeFile); 
     myOutWriter.close(); 
    } 
    catch (IOException ioe) 
    { 
     ioe.printStackTrace(); 
    } 
} 

在上面的代碼中,變量headerToWrite包含一個陣列,其中所述第一數值是:[1, Q, H, S, , 4, ±, Q, .....] 。這在十六進制是[31, 51, 48, 53, 01, 34, B1, 51...]

它被用來創建一個字符串completeFile其中= 1QHS 4±Q ...

然而,當正被寫入該文件,該文件包含1QHS 4A±Q .....這在十六進制是[31 51 48 53 01 34 c2 b1 51] ....

我不明白爲什麼有一個額外的C2,但我發現裏面myOutWriter分別爲字節如下:[49, 81, 72, 83, 1, 52, -62, -79, 81] ....

有趣的一點是這裏-62, -79這似乎是對c2, b1負責。對於它的工作,-62, -79應該是177,這是b1的小數。有趣的是177 + 79 256

所以顯然,在從ASCII字符completeFilemyOutWriter轉移到字節,c2被添加。

我想知道是否有人可以解釋爲什麼以及如何解決它。

由於

回答

1

-79可以通過溢出來解釋。由於byte是一個有符號的字符和177> 127(這是一個字節的最大值),它會溢出並且-79是結果。我無法真正解釋-62,但你顯然使用了錯誤的編碼(可能是UTF-8)。嘗試使用不同的編碼(ISO 8859-1可能會訣竅)。

+0

非常感謝。爲了完整起見,我更改了OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);到OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut,「ISO-8859-1」); – 2012-07-24 09:32:46

2

這可能是因爲通過附加一個字符串,它實際上它使用默認編碼,這可能是UTF-8轉換爲字節數組。要解決此問題,請使用ISO 8859-1編碼將字符串轉換爲字節數組,然後將該字節數組寫入輸出流。

相關問題