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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

import java.io.IOException;
import java.io.*;


public class FileReaderTest {
        public static void main(String[] args){
               
                try{FileReader fr=new FileReader("FileReaderTest.java");
                char[] cbuf=new char[32];
                int hasRead=0;
                while((hasRead=fr.read(cbuf))>0){
                        System.out.print(new String(cbuf,0,hasRead));
                }
                }catch(IOException e){
                        e.printStackTrace();
                       
                }
        }

}
上面代码是的作用是输出源文件的内容的,其他都没啥,可是那个Char[]数组长度才32字符,我看这代码怎么也不止32字符吧,我本来觉得它是跑不好或者说只会输出部份内容的,可最后输出正确,书上说是通过多次调用read()方法输出的,可这cbuf数组才32字符,存满了就没啦·又不会重新建一个,他怎么多次调用,还是说它每次读32个,然后输出,然后再读32个这样?

评分

参与人数 1技术分 +1 收起 理由
高境 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
那个只是缓冲数组,不是说一定要把需要复制的文件全部放进数组里面才打印出来,如果缓冲数组装满了,它就输出,然后再继续读取。
在这个问题上,其实你可以加一句代码验证下
public class FileReaderTest {
        public static void main(String[] args){
               
                try{FileReader fr=new FileReader("FileReaderTest.java");
                char[] cbuf=new char[32];
                int hasRead=0;
                while((hasRead=fr.read(cbuf))>0){
                        //在这里加上一句打印缓冲数组长度的语句
                        System.out.print(“cubf.length......"+cubf.length);
                        System.out.print(new String(cbuf,0,hasRead));
                }
                }catch(IOException e){
                        e.printStackTrace();
                        
                }
        }

}


运行结果是非常直观的

评分

参与人数 1技术分 +1 收起 理由
高境 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
就是相当于你定义了一个32个字符的数组,通过while循环读取,
读一次(就是读满32个字符)打印一次,
最后打完了,hasRead这个变量就<0了,就不打了。

所以不是说只打印一次,如果没有循环的话是会打不全的。
回复 使用道具 举报
就好比定义一个数组长度那么大的容器,一次最多只能装这么多,也就限制了你一次最多只能读容器大小那么的字符
然后通过while循环类控制,你读多少,然后就取多少;
回复 使用道具 举报
char[] cbuf=new char[32];这个缓冲数组,简单的是就是每次读取文件内容的大小,当读取的内容大于32的时候,就先将读取到的内容输出,然后再继续读取。
回复 使用道具 举报
这个帖子  没技术分加吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马