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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 晏文根 初级黑马   /  2012-6-13 19:17  /  2273 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.io.*;
class FileReaderTest
{
public static void main(String[] args) throws IOException
{
  FileReader fr = new FileReader("1.txt");
  

  char[] buf = new char[1024];
  int len= 0;
  while((len=fr.read(buf))!=-1)
  {
   System.out.println(new String(buf,0,num));
  }
  

  fr.close();
}
}
System.out.println(new String(buf,0,num));从这段代码可以知道len是用来计算read读取字节的长度,我不知道len是如何来实现自增的?这是问题1
另外read怎么知道里面已经读取了1024个字符,是通过len与1024的比较吗?这是问题2
请高手们指教。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 请查阅API中的read(byte[] b)方法~~

查看全部评分

5 个回复

倒序浏览
首先,len并不需要自增,len代表每次读入数组buf中的字节数。每执行一次:len=fr.read(buf)) 就为len重新赋一次值。每次的值是读入到数组buf的实际字节数。
read是将fr对应的数据读入到数组buf中,直到buf数组读满或者fr对应的内容被读完。
在读入数据时,fr内部的指针会向后移动,移动的位数是读入数组中的字节数值。所以每次调用read方法,都会从指针位置开始接着上一次的内容往后继续读数据,直到数据被读完,循环停止。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 恭喜~~~

查看全部评分

回复 使用道具 举报
len是通过每读一个字符就自增1;问题2:是通过数组的大小来决定的,开始char数组定义了大小是1024个字符,read()每读一个字符就添加到char数组里,当超过char数组长度时,就会返回一个值,直到等于-1为止。
回复 使用道具 举报
read()方法没有读完的时候,都会有一个标记位,下次从这个标记位开始读后面的数据。所以不是通过len与1024比较。
另外一个问题解释见代码部分的注释,具体可以参考一下jdk的api文档中的reader的read方法。
  1. import java.io.*;
  2. class FileReaderTest
  3. {
  4. public static void main(String[] args) throws IOException
  5. {
  6.   FileReader fr = new FileReader("1.txt");
  7.   
  8.   char[] buf = new char[1024];
  9.   int len= 0;
  10.   while((len=fr.read(buf))!=-1)//read()方法返回的是读取的字符数,如果已到达流的末尾,则返回 -1 ,len不用自增。
  11.   {
  12.    System.out.println(new String(buf,0,len));//这里应该是len不是num
  13.   }
  14.   
  15.   fr.close();
  16. }
  17. }
复制代码

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
黄奕豪 + 1 赞一个!
晏文根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
问题1:
字符流的读取过程中,每读取一个字符,read就返回一个int型值来表示,比如第一次读取一个字符len为1,读取第二个变为2,
依次类推,直到读完所有的数据。事实上read方法的返回值是int型就是这个原因。然后以int类型的-1来表示已读到结尾

问题2:
注意:这里的字符数组相当于缓冲区。缓冲区的作用只是临时存储,读取完缓冲区的数据后,只要源中还有数据,就还会把数据临时存储到缓冲区,继续读取。
程序的目的是读取到所有的数据,不管把缓冲区定义多大(可以不是1024),只要1.txt中还有数据,就会一直读下去,它的大小与len没有关系的。
len负责读取了多少个,什么时候读取完,缓冲区负责临时存储数据。就算len记录下了刚好读取的第1024个字符,也没有什么实际意义,只要还有数据没读完,还会继续重新把数据临时存储到缓冲区,然后继续读取。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
问题1  我觉得len不用自增 而是通过while循环来判断len=fr.read(buf))的值;
问题2  通过read方法逐个读取buf数组中的字符,直到全部读完。当不可再读时,就赋以-1值结束
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马