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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 闫玉泉 黑马帝   /  2012-1-2 17:55  /  2487 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看视频时有这么段代码:
  byte [] buf=new byte[1024]
  int len=0;
  while((len=fis.read(buf)))!=-1)
{  fos.write(buf,0,len);  这句实现原理,len的值怎么来的?不是只有到末尾才返回一个-1吗?
}
   

7 个回复

倒序浏览
本帖最后由 林晓波 于 2012-1-2 18:12 编辑

fis.read(buf)这里来的 ,他返回的是读取的字符数
fos.write(字符串,开始写入字符的偏移量,要写入的字符数);
当没读到字符时,即到末尾是-1 ,循环也就跳出

评分

参与人数 2技术分 +1 黑马币 +5 收起 理由
吴上储 + 1
闫玉泉 + 5 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 罗全涛 于 2012-1-2 18:12 编辑

fos.write(buf,0,len);  这句实现原理:
将读到的信息放到buf中,len代表实际读到的长度,如果读完fis.read(buf)返回-1,此处是向输出流中写数据:
将buf中的数据的有效数据写入到输出流中,有效长度由len标识。
一般在读到最后len的长度会和buf.length的长度不同,为了标识有效数据长度
才定义一个len。

评分

参与人数 2技术分 +1 黑马币 +5 收起 理由
吴上储 + 1
闫玉泉 + 5 很给力!

查看全部评分

回复 使用道具 举报

   首先你定义一个byte字节数组,用来读取输入流,暂存的地方,大小可以指定,然后通过输出流fos的writer方法把你的字节数组放进去,通过你的开始位置,以及结束位置,结束位置就是你数组的length,写到你指定的位置,while的-1是当你读的输入流资源结束,他会返回-1,其他情况就不可能返回-1,用这个条件判断while的周期,这样就实现了从读到写的过程!{:soso_e100:}

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
林晓波 发表于 2012-1-2 18:02
fis.read(buf)这里来的 ,他返回的是读取的字符数
fos.write(字符串,开始写入字符的偏移量,要写入的字符数) ...

谢谢解答
回复 使用道具 举报
罗全涛 发表于 2012-1-2 18:11
fos.write(buf,0,len);  这句实现原理:
将读到的信息放到buf中,len代表实际读到的长度,如果读完fis.rea ...

你讲的比较细我听明白了,不过好像buf.length就是有效数据的长度吧,你说的意思是不是有效长度与这个数组定义时的长度不一样吧
回复 使用道具 举报
本帖最后由 罗全涛 于 2012-1-2 18:56 编辑
闫玉泉 发表于 2012-1-2 18:43
你讲的比较细我听明白了,不过好像buf.length就是有效数据的长度吧,你说的意思是不是有效长度与这个数组 ...


恩,数组内读到数据的有效长度代表数组内读到了多少数据len,
而数组长度buf.length始终是个定值,到数据快读完的时候,
关注有效长度len
回复 使用道具 举报
沈样 黑马帝 2012-1-2 19:34:13
8#
我觉得是这样的 byte [] buf=new byte[1024]这个是定义一次读多少,len只是一个变量,API是这样写的read返回:
读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。所以只要len不是-1就一直读,我觉得len应该是读取文件的字节数,如果你想试试可以加条测试语句System.out.println(len);应该就明白了

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马