错误写入ASCII字符到的java /文件机器人
问题描述:
我有以下代码:错误写入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字符completeFile在myOutWriter转移到字节,c2
被添加。
我想知道是否有人可以解释为什么以及如何解决它。
由于
答
-79可以通过溢出来解释。由于byte
是一个有符号的字符和177> 127(这是一个字节的最大值),它会溢出并且-79是结果。我无法真正解释-62,但你显然使用了错误的编码(可能是UTF-8)。尝试使用不同的编码(ISO 8859-1可能会诀窍)。
答
这可能是因为通过附加一个字符串,它实际上它使用默认编码,这可能是UTF-8转换为字节数组。要解决此问题,请使用ISO 8859-1编码将字符串转换为字节数组,然后将该字节数组写入输出流。
非常感谢。为了完整起见,我更改了OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);到OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut,“ISO-8859-1”); – 2012-07-24 09:32:46