黑马程序员技术交流社区

标题: IO缓冲区中的一个小方法的疑问 [打印本页]

作者: 马超    时间: 2012-5-2 09:23
标题: IO缓冲区中的一个小方法的疑问
package IO练习;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
实现需求:拷贝一个文件*/
public class Copy
{
        public static void main(String[] args) throws IOException  //抛出异常
        {
                copy();  //调了copy()方法,我们在函数上要抛出异常
        }
        public static void copy() throws IOException
        {
                FileReader fr = null;
                FileWriter fw = null;
                try
                {
                        fr = new FileReader("Arraytest.java");
                        fw = new FileWriter("ArraytestCopy.txt");  //相当于创建了一个文件ArraytestCopy.txt
                        char[] ch = new char[1024];
                       
                        int len = 0;
                       
                        while((len = fr.read(ch))!=-1) //只要我从读的文件Arraytest.java当中没有读到空
                        {
                                fw.write(ch); //我就把读到的内容写到数组里边当中去,执行这一句的时候做了打印动作,它是存满1024个字节才打印一便的还是?                        }
                }
                catch(IOException e)
                {
                        throw new RuntimeException("读取错误");
                }
                finally
                {
                        if(fr != null)
                                try
                                {
                                        fr.close();//由于它是FileWriter的子类对象,我们就要对它
                                                            //进行try语句判断。
                                }
                                catch(IOException e)
                                {
                                       
                                }
                        if(fw != null)
                                try
                                {
                                        fw.close();
                                }
                                catch(IOException e)
                                {
                                       
                                                    }
作者: 刘基军    时间: 2012-5-2 10:00
while((len = fr.read(ch))!=-1)
      {
                                fw.write(ch); //1.正确的写法应该是: fw.write(ch, 0, len);你比较一下两个文件的大小就知道两者的区别了
                                  //2.执行一次fr.read(ch),就会向文件写一次.一次最多能读到1024个字符数据,若是第一次不够(源文件本身大小小于1024个字符)或最后一次不够,那就以实际读到的字符数据个数为准,记在len中,所以应该使用:fw.write(ch, 0, len);
      }

作者: 蒋映辉    时间: 2012-5-2 10:02
fr.read(ch))把数据存入数组是在这句代码实现的
如果你的代码超过1024字节  就满了以后答应,如果没超过,就有多少打印多少
作者: 岳民喜    时间: 2012-5-2 10:06
      while((len = fr.read(ch))!=-1) //只要我从读的文件Arraytest.java当中没有读到空
                        {
                                fw.write(ch); //我就把读到的内容写到数组里边当中去,执行这一句的时候做了打印动作,它是存满1024个字节才打印一便的还是?                        }

只要你定义的new char[1024]字符能够装下读取文件中的内容,那么它是一次性把ch中内容写入指定文件的。
所以在定义的字符数组大小的 时候应该注意数组大小。
作者: 贾联国    时间: 2012-5-2 10:30
while((len = fr.read(ch))!=-1) // fr.read(ch)返回的是存入数组的元素个数,只要有数据,fr.read(ch))!=-1就返回真,并把len个数据存到ch中,如果文件很大,就先存1024个,进行循环语句之后再存剩下的,直到文本读取完毕。
                        {
                                fw.write(ch); //如果文本很小,不用存满1024。如果文本很大,超过1024,则每存1024个打印一次。
                       }
                }

作者: 真真姐    时间: 2012-5-2 12:26
                       char[] ch = new char[1024];     //定义的字符缓冲区,这里可以根据需要定义长度,但是一般情况下,不需要太大,否则会占用系统资源
                       
                        int len = 0;
                        
                        while((len = fr.read(ch))!=-1)    // 这里的意思是,每次从字符缓冲区中读取1024长度的内容,然后写入制定的位置
                        {
                                fw.write(ch);  

这里注意两个问题:  A、 ch 写的太大写的太大,你又多个地方new的话实际上属于浪费,和占用资源   
                             B、如果最后一次不到1024就没有内容了怎么办,那这时就会返回-1,然后停止读取,系统会自动把最后的这些内容写入,跳出!
                              相当于 while(frd.read(ch)!=-1||frd.read(ch)!=null)




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