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

Java ByteArrayInputStream#read()负输入字节的奇怪行为,java,io,byte,bytearray,inputstream,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。为什么?请参见: 值字节以int形式返回,范围为0到255

我在测试中遇到了这个代码

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。为什么?

请参见:

值字节以int形式返回,范围为0到255

尝试打印以下内容,您就会明白:

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中,字节以8位表示,如果
int
在[128255]范围内,则对
byte
的转换将分别为[-1,-128]

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看起来像一个字节。
1111111

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

0000 0000 0000 1111111 1111

这是整数255,不是-1

int-1如下所示:

1111111111111111111111111111111111111111111111111


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

这是因为
read()
方法将数据(每个1字节)读取为整数(4字节)@parsa porahmad您可以详细显示它吗?根据
read()
方法读取下一个字节并将其作为整数返回。这意味着它在左实际值处添加了3个字节的空字节(nul)字节并返回它,因此-1将是255,还不清楚?但字节负值的行为(对我来说)不是预期的。您可以使用
DataInputStream
而不是
InputStream
类,它有一个方法
readByte()
读取一个字节并将其作为字节返回。我不明白为什么第一条语句返回255Because-1=0xFF并加宽到int 0xffffff。然后只取第一个字节0xFFFFFF&0xFF=0x000000FF。这就是将255作为int.int 128转换为byte=-128的方式。int 255转换为字节=-1第一个数字被读取为int 255这是问题的关键为什么是int?构造函数看起来像public ByteArrayInputStream(byte buf[])…是的,但是方法
read
返回int而不是byte。请参见此处:因此符号位表示为值位?是的,字节值-n(对于间隔[1128]中的每个n)被读回为int值256-n。这是这里的一般模式。用例如-1、-2、-5、-100、-127、-128来试试。