文档说read()
会将byte
作为int
与0
之间的255
值返回。
这个值代表什么?
答案 0 :(得分:2)
在二进制补码中,数字-1
由设置为1的所有位表示。
这是-1
:*
1111 1111
这是-1
:*
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:
整数类型为
byte
,short
,int
和long
,其值为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。当一个字节转换为无符号整数时,它将在0
和255
之间,因为这些位是1+2+4+8+16+32+64+128 = 255
。它代表什么取决于哪种数据转换为二进制数据并通过字节流发送。
P.S。:请记住确定传入的流是big-endian
还是little-endian