lz下面是我在网上找的,虽然我也不太明白但我只能帮到你这了
InputStream()中的read方法
public abstract int read()throws IOException
从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。
如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、
检测到流末尾或者抛出异常前,此方法一直阻塞。子类必须提供此方法的一个实现。
返回:
下一个数据字节;如果到达流的末尾,则返回 -1。
抛出:
IOException - 如果发生 I/O 错误。
问题一:为啥读取的是一个byte,返回值是int,为什么这么麻烦?如果从输入流中读取的下一个字节是11111111(十进制为-1),(ch = in.read()) != -1为false,输出流中读入不就中止了吗?
read()方法返回的是“ 0 到 255 范围内的 int 字节值”,问题一的实质变为了:读取时遇到11111111返回的是什么?
查看此例中read()方法的源码(java.io.BufferedInputStream):
public synchronized int read() throws IOException {
if (pos >= count) {
fill();
if (pos >= count)
return -1;
}
return getBufIfOpen()[pos++] & 0xff;
}
可以看出,read()返回的是和0xff与运算的结果。
-1和0xff与运算:
11111111 11111111 11111111 11111111
&00000000 00000000 00000000 11111111
------------------------------------
00000000 00000000 00000000 11111111
结果变为了255,确实不是-1。byte范围是-128到127,"和0xff与运算"这样的处理,将返回值的范围变为了0到255方法了,
这样就可以将“-1”作为读取到流末尾的返回值了。
问题一得到了解决,那么,既然读取的是一个int,写入的时候时候怎么办。
查看此例中的write(int)方法(java.in.BufferedOutputStream):
public synchronized void write(int b) throws IOException {
if (count >= buf.length) {
flushBuffer();
}
buf[count++] = (byte)b;
}
可以看出,如果读取的是11111111,返回的是255,写入的时候将255转换为byte即-1。 |