gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:30:27 25 4
gpt4 key购买 nike

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”被截断为字节,其将具有相应的十进制值:-101。即使有关字符的信息似乎已丢失,它如何成功地将字符写入文件?

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

The general contract for write is that one byte is written to the output stream. The byte to be written is the eight low-order bits of the argument b. The 24 high-order bits of b are ignored.

所以我相信,与我之前的想法相反(write() 中的 int 被截断,就像将整数向下转换为字节以获取大于 127 的值时发生的情况一样),仅忽略 24 个高阶位,并且仅忽略 8 个最低有效位位被考虑。不会发生截断和字节转换。我想我是对的。

最佳答案

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

事实上,155 作为无符号字节是 -101 作为有符号字节。 (256 - 101 == 155)。位模式是相同的。这只是您认为它们是已签名还是未签名的问题。

截断的编码方式是特定于实现的。但不会丢失任何信息……假设您一开始就有一个 8 位代码。

关于java - FileOutputStream 中的 write 方法如何截断 int 类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19402568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com