黑马程序员技术交流社区

标题: 关于字节流底层实现机制的问题 [打印本页]

作者: 贾振凯    时间: 2013-2-23 00:12
标题: 关于字节流底层实现机制的问题
本帖最后由 贾振凯 于 2013-2-24 16:57 编辑

疑点:在字节输入流中,循环读取文件数据到数组时,如下
FileInputStream fis = new FileInputStream ("xxx.txt");
int  len = 0;
byte[] array = new   byte[1024] ;
while((len = fis.reade(array)) != -1){
                ...............
         }
最后一次往数组读取数据与返回-1是同一次吗?
作者: 唐长智    时间: 2013-2-23 01:28
不是同一次。read()方法应该是把字节数据存入到一个byte数组中,让后读取这个数组中的元素。如果读的值为-1是这个数组的角标越界了吧。
作者: 逍林游    时间: 2013-2-23 09:40
最后一次读取数据时:是将字节流数据写入byte数组,当数据读完时就返回-1.
作者: 杨玲    时间: 2013-2-23 10:11
呵呵,我的观点同楼上的同学一样,这么分析吧!

我们从read方法分析起吧!

read:它接收一个byte数组,返回数组中读取到的数据长度。

那么假设我的数组长1024字节,但最后一次读取的时候流中只有500个字节了

那么返回的肯定是500而不会是-1吧?

只要当再一次读取的时候,一个字节都没有了然后它才返回-1.

所以read方法中大概的代码应该是这样的:
  1. //我这个代码只是伪代码,只为了理清逻辑关系了,所以别跟它较真!谢谢!
  2. public int read(byte[] buf)
  3. {
  4.   //读的代码就省了吧,只是看逻辑
  5.   if(buf.length==0)//一个都没有读到
  6.       return -1
  7. else
  8.       return buf.length;
  9. }
复制代码

作者: 朱玉玺    时间: 2013-2-23 16:10
杨玲 发表于 2013-2-23 10:11
呵呵,我的观点同楼上的同学一样,这么分析吧!

我们从read方法分析起吧!

其实,老毕在视频中说,它判断的不是buf.length,而是根据底层的东西返回的-1;你发现没,buf.length是数组的长度,是个固定值,你这里想表示的该次读取的字符数,但即使是读取的字符数为0,也不代表结束,你发现没,len的值是可以为0,但不代表结束了。根据老毕的说法,windows文件都有个结束标记,查看源代码发现,字节流read方法调用的是个native方法,我推测这个read方法内部,一开始就判断这个结束标记是否为true,不为true则继续读,为true就返回-1.
作者: 杨玲    时间: 2013-2-23 22:21
朱玉玺 发表于 2013-2-23 16:10
其实,老毕在视频中说,它判断的不是buf.length,而是根据底层的东西返回的-1;你发现没,buf.length是数 ...

伪代码嘛!
作者: 刘圣繁    时间: 2013-2-23 23:33
简单的说:倒数第二次读取到的是最后的数据   倒数第一次读到的是-1  否则按照这个循环最后读到的数据就处理不了了啊  和三楼想的一样




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2