ByteArrayInputStream #read()负输入字节的奇怪行为

时间:2014-03-23 10:19:39

标签: java io byte bytearray inputstream

我在测试中面对这段代码。

byte[] bytes = new byte[] { -1, 1, 0x0 }; 
InputStream in = new ByteArrayInputStream(bytes); 
System.out.println(in.read() + in.read() + in.read());

我希望这段代码返回0(-1 + 1 + 0),但它返回256。

我很纳闷。

谁可以解释这个行为?

P.S。

显示第一个语句返回255.为什么?

2 个答案:

答案 0 :(得分:2)

请参阅InputStream#read

  

值字节在范围0到255

中作为int返回

尝试打印以下内容,您将理解:

System.out.println(in.read());  //prints 255
System.out.println(in.read());  //prints 1
System.out.println(in.read());  //prints 0

所以256实际上是255 + 1 + 0.

编辑:

read()方法一次读取一个字节。在Java中,字节two's complement中以8位表示,如果int在范围[128,255]中,则转换为byte将是[-1,-128]。

答案 1 :(得分:2)

尝试使用此代码,您将看到原因。

import java.io.ByteArrayInputStream;
import java.io.InputStream;


public class Test006 {

    public static void main(String[] args) throws Exception {
        byte[] bytes = new byte[] { -1, 1, 0x0 }; 
        InputStream in = new ByteArrayInputStream(bytes);
        System.out.println(in.read());
        System.out.println(in.read());
        System.out.println(in.read());
    }

}

第一个数字作为int 255读取,因此总和为256.

值-1看起来像一个字节 1111 1111

显然,当它作为int读取时,Java不会添加前导1 (保留将其转换为int -1的符号)但添加​​
领先的零。所以这个int变成了:

<00> 0000 0000 0000 0000 0000 0000 1111 1111

这是int 255而不是-1。

int -1看起来像这样:

1111 1111 1111 1111 1111 1111 1111 1111

所以......这就是int 255的来源。