2012-07-24 44 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编码将字符串转换为字节数组,然后将该字节数组写入输出流。

相关问题