read()函数一次读取一个字节,此函数的返回类型为int。我想知道引擎盖下发生了什么,以便将字节作为int返回。我不了解按位运算符,所以任何人都可以用我能够轻易掌握它的方式回答。
答案 0 :(得分:3)
这取决于流实现。在某些情况下,方法实现是本机代码。在其他方面,逻辑很简单;例如,ByteArrayInputStream
read()
方法执行此操作:
public class ByteArrayInputStream extends InputStream {
protected byte buf[];
protected int count;
protected int pos;
...
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}
}
换句话说,字节被转换为0到255范围内的整数,就像javadoc状态一样,并且在逻辑结束时返回-1。
buf[pos++] & 0xff
的逻辑如下:
buf[pos++]
转换为int
& 0xff
将带符号的整数(-128转换为+127)转换为表示为整数的“无符号”字节(0到255)。答案 1 :(得分:1)
在幕后,如果到达流的末尾,read()返回-1。否则,它将字节值作为int返回(因此值介于0和255之间)。
在确认结果不是-1后,您可以使用
获取带符号的字节值listings.images
这将保留int的最右边8位,右边的第8位用作符号位,从而导致有符号值,介于-128和127之间。
如果该方法返回一个字节,除了抛出异常之外,没有办法表示已经到达了流的末尾。
答案 2 :(得分:0)
下面是使用InputStream的read()方法一次读取一个字节的程序:
public class Main {
public static void main(String[] args) {
try {
InputStream input = new FileInputStream("E:\\in.txt");
int intVal;
while((intVal = input.read()) >=0)
{
byte byteVal = (byte) intVal;
System.out.println(byteVal);
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
请不要因为input.read()返回的intVal是从文件in.txt中读取的字符的字节值。