黑马程序员技术交流社区

标题: io中关于读数组方法的问题 [打印本页]

作者: 罗广伟    时间: 2013-7-17 15:13
标题: io中关于读数组方法的问题
本帖最后由 罗广伟 于 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呢?

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

作者: crazy_primitive    时间: 2013-7-18 02:04
fis.read(buf)会一直往buf数组里面存储读到的字节数据,当读到结束标记(即len==-1)时它打印第08行的那个输出语句输出存储在字节数组里的数据。当
作者: crazy_primitive    时间: 2013-7-18 02:07
当 没有读到结束标记时它每读到一个字节的数据就存到字节数组里,然后打印出来,属于一次打印一个字节,而上面的是一次打印数组里的所有数据。




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