InputStream.read()返回的int值表示什么?

时间:2014-11-10 04:49:47

标签: java byte primitive-types

文档说read()会将byte作为int0之间的255值返回。

这个值代表什么?

5 个答案:

答案 0 :(得分:2)

在二进制补码中,数字-1由设置为1的所有位表示。

这是-1:*

的字节值
1111 1111

这是-1:*

的int值
1111 1111 1111 1111 1111 1111 1111 1111

如果我们取-1的字节值并将其存储在int中而不扩展符号,则它变为255

0000 0000 0000 0000 0000 0000 1111 1111

这只是两个补充的行为。在int中存储字节会留下我们可以用来指示其他内容的剩余位。

因此,输入流会返回0 - 255-1的字节值,以指示流的结束。要获取字节值,请将int强制转换为字节:

int byteAsInt = inputStream.read();
if(byteAsInt > -1) {
     byte byteValue = (byte)byteAsInt;

     // use the byte
}

int值128 - 255在被转换为字节时将被解释为负数。或者,您可以执行" unsigned"算术上的int。

字节本身可以表示任何意义。例如,如果它们来自.txt文件,则它们可能是直接的ASCII码。其他格式可能要复杂得多。


* 4.2:

  

整数类型为byteshortintlong,其值为8位,16位,32位和64位分别签署了两个补码整数[...]。

答案 1 :(得分:0)

read()读取下一个字节,然后返回它。

它作为int而不是像你期望的那样返回一个字节的原因是一个字节被签名(有-127到128之间的值)因此它不能用于返回0-之间的值255

答案 2 :(得分:0)

它代表下一个数据字节。它返回int而不是byte的原因是该字节类型介于-128和127之间,此方法使用值-1来表示流的结束。

答案 3 :(得分:0)

它没有代表"任何东西。无论InputStream的下一个字节是什么。

例如,FileInputStream允许您从文件中读取字节。如果该文件中的第一个字节是37,那么read()将返回37.如果文件中的第二个字节是231,则对read()的第二个调用将返回231.字节作为无符号返回值,表示每个字节的值可以在0到255之间(包括)。

如果该值为非负数且您希望它为byte,则可以将其强制转换为:

int nextByteAsInt = inputStream.read();
if (nextByteAsInt >= 0) {
    byte nextByte = (byte) nextByteAsInt;
    doSomethingWithByte(nextByte);
} else {
    inputStreamIsFinished();
}

读取完所有文件后,read()将返回-1。 read()不返回byte的原因是,如果需要能够返回-1来表示流的结尾。

获取字节"的意思,"你必须了解他们的背景 - 你正在阅读的内容。来自文本文件的字节意味着一件事,来自压缩文件或二进制文件的文件将意味着另一件事,等等。

答案 4 :(得分:0)

Read()返回字节流中的下一个字节,转换为unsigned int。当一个字节转换为无符号整数时,它将在0255之间,因为这些位是1+2+4+8+16+32+64+128 = 255。它代表什么取决于哪种数据转换为二进制数据并通过字节流发送。

P.S。:请记住确定传入的流是big-endian还是little-endian