A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾振凯 中级黑马   /  2013-2-23 00:12  /  2502 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 贾振凯 于 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是同一次吗?

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

6 个回复

倒序浏览
不是同一次。read()方法应该是把字节数据存入到一个byte数组中,让后读取这个数组中的元素。如果读的值为-1是这个数组的角标越界了吧。
回复 使用道具 举报
最后一次读取数据时:是将字节流数据写入byte数组,当数据读完时就返回-1.
回复 使用道具 举报
呵呵,我的观点同楼上的同学一样,这么分析吧!

我们从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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
杨玲 发表于 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 16:10
其实,老毕在视频中说,它判断的不是buf.length,而是根据底层的东西返回的-1;你发现没,buf.length是数 ...

伪代码嘛!
回复 使用道具 举报
简单的说:倒数第二次读取到的是最后的数据   倒数第一次读到的是-1  否则按照这个循环最后读到的数据就处理不了了啊  和三楼想的一样
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马