为什么在BufferedOutputStream中使用int参数将int转换为byte参数?

时间:2014-10-15 19:01:32

标签: java casting outputstream

在“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方法?由于程序运行没有错误,因此JVM将int-cast-to-a-byte重新转换为int?或者,JVM将孤立字节转换为具有单个元素的数组以满足write参数?要么?

我编写了示例并使用强制转换器运行它而没有强制转换,两者都没有发生事故。所以我很想放弃演员阵容,但我觉得这是我不明白的理由。

3 个答案:

答案 0 :(得分:2)

从技术上讲,没有理由进行演员表演。也许作者认为如果包括演员阵容,节目会更清晰。

答案 1 :(得分:2)

幸运的是,在BufferedOutputStream.write()方法中,强制转换无关紧要 演员会发生。

public synchronized void write(int b) throws IOException {
    if (count >= buf.length) {
        flushBuffer();
    }
    buf[count++] = (byte)b;
}

正如文档所述,该方法只写入8位,其余的将被忽略。 这是将int类型转换为byte的效果。

我认为作者将演员说明了要写入输出的内容!这样,不知情的开发人员不需要咨询JavaDoc来查看将要写入输出的内容!

最好尽可能地澄清您的代码。

P.S:代码运行如下 intByte将转换为byte 因为扩大write(int)方法的效果会被调用 其余的......

答案 2 :(得分:1)

通过将intByte转换为byte,该值从32位缩小到8位。 write()方法可以接受一个字节,即使它的签名要求int - 这称为扩展(不需要强制转换)。那部分是无关紧要的。但是从intbyte的强制转换很重要,因为它可以通过削减前24位来显着影响变量的值。例如,试试这个,看看会发生什么:

int i = 13465878; byte b = (byte)i; System.out.println("i as a byte is " + b);

相关问题