0

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

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

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

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

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

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

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

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

4

1 回答 1

3

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

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

截断的编码方式是特定于实现的。但是没有信息丢失……假设您首先有一个 8 位代码。

于 2013-10-16T12:14:20.020 回答