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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗广伟 中级黑马   /  2013-7-17 15:13  /  1161 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗广伟 于 2013-7-18 09:50 编辑
  1. <div class="blockcode"><blockquote>FileInputStream fis=new FileInputStream("g:\\program\\1.txt");
  2.                         byte[] buf=new byte[1024];
  3.                         int len=0;
  4.                         while((len=fis.read(buf))!=-1)
  5.                         {
  6.                         System.out.println(len);
  7.                         }
  8.                         System.out.println(len);
复制代码
问题是读字符数组这个方法是如何工作的。如果文件中有2个字节的数据,那么肯定是读到结束标记才知道有两个字节,那是不是读到结束标记后先把前面数据的字节数返回,再读一次结束标记再返回-1呢?

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

4 个回复

倒序浏览
其实抛开你的问题回归本质的话~其实就是fis.read(buf))在读取内容的时候,角标是读一次往后移动一次,当移动到流的末尾的时候,也就是有值的最后一位的时候返回的还不是-1,这个时候是会进行sop输出的!当while再次循环的时候,在判断的()里面,fis.read(buf))!=-1,成立了,直接跳出了循环!!现在回到你说的字符数组~你的程序中的len值应该是byte类型的,是数字,如果要变成字符,要(char)强制转换一下的说~而且我们读取字符,一般情况都会使用字符流的方法读取!而对于文字,总不可能让我读取半个字就返回吧,所以肯定是要把整个字节读完才进行返回的!所以应该是读完返回~然后再判断,返回-1

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报 0 1
read()方法和readLine()方法不同,
readLine()方法读到回车符的时候结束,
read()方法是没有结束符的,如果非要说有,那就是null;结束有两种:一种是读完了,另一种是读buf.length个字节;
每次读完之后返回读取长度 int类型的值;如果没有内容,也就是null,返回 -1;
你可以试着把字节数组 buf 弄小一点;看看每次读取过程;
如果想看看读完之后有没有再去读一次的话,可以把循环部分作下修改
  1. while(true)
  2.                 {
  3.                         len = fis.read(buf);
  4.                         if(len==-1)
  5.                         {
  6.                                 System.out.println("读完之后再读了一次!");
  7.                                 break;
  8.                         }
  9.                         System.out.println(len);
  10.                 }
复制代码
回复 使用道具 举报
fis.read(buf)会一直往buf数组里面存储读到的字节数据,当读到结束标记(即len==-1)时它打印第08行的那个输出语句输出存储在字节数组里的数据。当
回复 使用道具 举报
当 没有读到结束标记时它每读到一个字节的数据就存到字节数组里,然后打印出来,属于一次打印一个字节,而上面的是一次打印数组里的所有数据。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马