【发布时间】:2014-10-15 19:01:31
【问题描述】:
在“Java 编程简介”第 9 版,作者 Y. Daniel Liang,在第 19 章关于二进制 IO 中写了一个代码示例,其中 write() 方法将一个 int 转换为一个字节。为什么?
例如:
/*
* Read and write bytes.
*/
int intByte = 0;
int numberOfBytesCopied = 0;
while( (intByte = bufferedInputStream.read()) != -1){
bufferedOutputStream.write((byte)intByte);
numberOfBytesCopied ++;
}
Java Documentation表示三种重载的写方法:一个是字节数组,另一个是字节数组(允许指定起点和终点),另一个是int。
为什么上面的文本将intByte 转换为一个字节?通过进行该演员表,我看不到需要单个字节的write 方法吗?既然程序运行没有错误,那么 int-cast-to-a-byte 是否被 JVM 重铸为 int?还是JVM将孤独的字节转换为具有单个元素的数组以满足write参数?或者?
我对示例进行了编码,并在有演员表和不演员表的情况下运行它,两者都运行时没有发生任何事故。所以我很想取消演员阵容,但我不明白这是有原因的。
【问题讨论】:
-
如果您复制的流包含值 >127 会怎样?
-
您指向的文档回答了我认为的问题:
he 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,即 4 个字节,也只会写入该 int 的最低字节。所以演员表有点多余,因为无论如何只考虑最低 8 位。所以“在某种程度上”write(int)方法实际上是在寻找一个 8 位参数,并不关心它是 int 还是 byte。 -
@rossstudtman 我仍然不是 100% 相信此代码在与 >127 字节一起使用时可以正常工作。
(int)((byte)255)不应该评估为 -1 而不是 255? -
@biziclop 我不太明白;我正在读取的文件是一个文本文件(从技术上讲,也许阅读器会更准确?) - 我承认,对于被读取为字节的字符,我有点模糊。以我有限的理解,UTF-8 最多可以写入 3 个字节,但 ASCII 使用单个字节(畏缩)?如果我写了一个使用所有 3 个字节的疯狂字符,那么通过 InputStream 的
read读取它需要 3 个 OutputStreamwrites来写入完整字符?
标签: java casting outputstream