黑马程序员技术交流社区
标题:
IO流的一点疑问
[打印本页]
作者:
彭润生
时间:
2012-9-15 13:28
标题:
IO流的一点疑问
本帖最后由 彭润生 于 2012-9-16 12:17 编辑
class MyBufferedStream
{
private InputStream is;
private byte[] buf = new byte[1024];
private int pos=0,count=0;
MyBufferedStream(InputStream is)
{
this.is = is;
}
public int myRread()throws IOException//
这儿为什么不返回byte,其InputStream中read也是返回int。为什么要返回int,既然里面读的直接就是byte,为什么不返回byte呢。
{
if(count==0)
{
count = is.read(buf);
if(count<0)
return -1;
pos = 0;
byte b = buf[pos];
pos++;
count--;
return b&255;//提升字节。
}
else if(count>0)
{
byte b = buf[pos];
pos++;
count--;
return b&0xff;
}
}
public void myClose()throws IOException
{
is.close();
}
}
作者:
马睿
时间:
2012-9-15 16:54
本帖最后由 马睿 于 2012-9-15 17:01 编辑
毕老师的课程讲述过这个问题……
主要目的是为了区别读取的是 -1 所以定义成int 进行升字节操作(int是32个位数的二进制 ,4个字节)
因为读取的byte是8位二进制
也就是0000-0000~1111-1111的形式(-是连接符)
而在计算机中,你读取文件可能读取到这样的数据
1111-1111 1111-1111 1111-1111 1111-1111
我们知道byte会将 - 1写成1111-1111 byte的范围是 -128~127
而InputStream在返回为-1的时候则认为是文件流的结束,为了区别它
将0000-0000 0000-0000 0000-0000 1111-1111
&1111-1111 1111-1111 1111-1111 1111-1111 (255)
-------------------------------------------------------------------------
最后运算结果
0000-0000 0000-0000 0000-0000 1111-1111
然后以int返还,这样得到的是255,而不是-1(读取转义为byte类型时又会把它读做-1,原因是byte的范围是 -128~127 ,突然出现个255,除了-1还有谁呢?嘿嘿)
这样做了即可分辨是读取到文件的-1数据了,还是读到文件字节流结束了
作者:
彭润生
时间:
2012-9-15 18:35
马睿 发表于 2012-9-15 16:54
毕老师的课程讲述过这个问题……
主要目的是为了区别读取的是 -1 所以定义成int 进行升字节操作(int是32个 ...
那么结束的那个-1呢
作者:
马睿
时间:
2012-9-15 18:58
本帖最后由 马睿 于 2012-9-15 19:00 编辑
结束的那个-1是读到文件流末尾结束return -1
看你的代码里好像漏了return -1
count = is.read(buf); 得到的是单个字节,然后,当读到文件结束的时候会得到一个byte又系统设备中断服务程序返还(抽象层的,你看不到的),其二进制为1111-1111(也就是-1)
public int myRread()throws IOException
这个方法函数最后请再加入一个return -1(你漏了)
因为你对count的判断,其中count = is.read(buf);最后会得到-1,这样会缺少返回值
作者:
黑马张旭明
时间:
2012-9-15 19:25
myRead()这个函数返回-1来判定是否结束,如果按原来byte型返回的话,当数据里有连续8个1会和判定的-1重复,这意味着数据读到1111-1111时即使没读完也会因为返回了-1而停下来。
可以看出当返回byte的时候都要&255,即延长到32位,高出的24位补0,这样出来的int型数据就不会出现-1了。
count=is.read(buf);返回的值是读取到数组buf里的byte型数据有多少个,没读到的话就返回-1。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2