FileOutputStream中的write方法如何截断int类型参数

时间:2013-10-16 11:47:51

标签: java byte fileinputstream

FileOutputStream中的

write()方法接受一个int但截断前3个字节并将该字节写入流。 如果文件包含ASCII值大于127且从中读取字节然后写入输出流(另一个文本文件)的字符,它将如何显示它,因为在Java字节中最大值可能为+127。

如果文本文件(input.text)的字符“>”的ASCII值为155。 输入流,输入,从中读取: int in= new FileInputStream("input.txt").read();//in = 155

现在它写入另一个文本文件(output.txt)

new FileOutputStream("output.txt").write(in);

这里整数“in”被截断为byte,它将具有相应的十进制值:-101。 它是如何成功地将字符写入文件的,尽管有关它的信息似乎已经丢失了?

刚才我在java文档中描述了write(int)方法,我观察到的是

  

写入的一般合同是将一个字节写入输出流。要写入的字节是参数b的八个低位。 b的24个高位被忽略

所以我认为与我之前的想法相反(write()中的int被截断,如果将一个整数向下转换为大于127的值,则24个高阶位只被忽略,只有8个最低有效位比特被考虑。 不会发生截断和转换为字节。 我想我是对的。

1 个答案:

答案 0 :(得分:3)

我认为您的困惑是由于字符集的规范通常认为字节是无符号的,而Java将字节视为已签名。

实际上155作为无符号字节是-101作为有符号字节。 (256 - 101 == 155)。位模式是相同的。这只是你是否认为是签名或未签名的问题。

如何编码截断是特定于实现的。但是没有信息丢失......假设你首先有一个8位代码。