黑马程序员技术交流社区

标题: IO读取文件的疑惑,求教育<已解决> [打印本页]

作者: 徐小骥    时间: 2012-8-6 15:00
标题: IO读取文件的疑惑,求教育<已解决>
本帖最后由 徐小骥 于 2012-8-6 16:44 编辑
  1. 代码装不下被清了一部分。。。白修改了。。。现在直接发在内容中
复制代码
import java.io.*;


public class FileCtrlC {
        private static FileReader fr=null;//声明reader流并初始化
        private static FileWriter fw=null;//声明writer流并初始化
        public FileCtrlC(FileReader fr){//外部调用方法
                this.fr=fr;
        }
        public static void main(String[] args) throws IOException{        
                FileCtrlC.fr=new FileReader("f:\\IOtest1.txt");
                copy1(fr);//调用方法copy1(FileReader fr)
                FileCtrlC.fr=new FileReader("f:\\IOtest1.txt");//为什么这里必须再给fr赋值才能调用调用方法copy2(FileReader fr)?
                copy2(fr);//调用方法copy2(FileReader fr)

//copy2(copy1(fr) ) ;// copy2调用copy1返回的内容
        }

//public static FileReader  copy1(FileReader fr) throws IOException //带返回内容的copy方法
        public static void copy1(FileReader fr) throws IOException{//拷贝文件方法2
                fw=new FileWriter("f:\\IOtest2.txt",true);//实例化要写入的文件对象,标记为可续写
                char[] ch=new char[1024];
                int num=0;
                while((num=fr.read(ch))!=-1){
                        fw.write(ch, 0, num);
                        fw.flush();
                }
                close(fr,fw);//调用close方法
        }
        public static void copy2(FileReader fr){//拷贝文件方法2
                try {
                 fw=new FileWriter("f:\\IOtest3.txt",true);
                int num=0;
                        while((num=fr.read())!=-1){
                                fw.write(num);
                                fw.flush();
                        }
                } catch (IOException e) {
                         throw new RuntimeException("读写失败");
                }finally{
                close(fr,fw);//调用close方法
                }

//return fr;// FileReader  copy1 ()返回的内容
        }
        private static void close(FileReader fr,FileWriter fw){//关闭流的方法
                try {
                        if(fr!=null){
                        fr.close();
                        }
                } catch (IOException e) {
        throw new RuntimeException("Reader流关闭失败");
                }finally{
                        try {
                         if(fw!=null){
                             fw.close();
                             }        
                        } catch (IOException e) {
                                throw new RuntimeException("Writer流关闭失败");
                }
            }
        }
}
要拷贝的文件被copy1处理后,为什么在调用copy2时必须再赋值才能完成操作?是因为copy1处理后fr就被垃圾机制回收了?即使修改copy1的代码在最后return一个fr,再从copy2调用copy1,copy2运行也会报错,是因为fr被writer后就被释放了?
作者: 周世阳    时间: 2012-8-6 15:20
fr并没有被释放,但是一旦掉用了close()方法,操作系统分配给jvm的I/O资源就会被收回,所以fr必须重新引用一个分配了系统I/O资源FileWrite对象才能写入
作者: 徐小骥    时间: 2012-8-6 15:35
周世阳 发表于 2012-8-6 15:20
fr并没有被释放,但是一旦掉用了close()方法,操作系统分配给jvm的I/O资源就会被收回,所以fr必须重新引 ...

但是我修改代码,在copy1中不关闭流,copy2也没有拷贝出内容啊,这是怎么回事?
作者: 周世阳    时间: 2012-8-6 15:42
徐小骥 发表于 2012-8-6 15:35
但是我修改代码,在copy1中不关闭流,copy2也没有拷贝出内容啊,这是怎么回事? ...

修改后的贴上来
作者: 徐小骥    时间: 2012-8-6 15:52
周世阳 发表于 2012-8-6 15:42
修改后的贴上来

public class FileCtrlC {
        private static FileReader fr=null;//声明reader流并初始化
        private static FileWriter fw=null;//声明writer流并初始化
        public FileCtrlC(FileReader fr){//外部调用方法
                this.fr=fr;
        }
        public static void main(String[] args) throws IOException{       
                FileCtrlC.fr=new FileReader("f:\\IOtest1.txt");
                copy2(copy1(fr));
                //(fr);//调用方法copy1(FileReader fr)
                //FileCtrlC.fr=new FileReader("f:\\IOtest1.txt");//为什么这里必须再给fr赋值才能调用调用方法copy2(FileReader fr)?
                //copy2(fr);//调用方法copy2(FileReader fr)
        }
        public static FileReader copy1(FileReader fr) throws IOException{//拷贝文件方法2
                fw=new FileWriter("f:\\IOtest2.txt",true);//实例化要写入的文件对象,标记为可续写
                char[] ch=new char[1024];
                int num=0;
                while((num=fr.read(ch))!=-1){
                        fw.write(ch, 0, num);
                        fw.flush();
                }
                return fr;
                //close(fr,fw);//调用close方法
        }
        public static void copy2(FileReader fr){//拷贝文件方法2
                try {
                 fw=new FileWriter("f:\\IOtest3.txt",true);
                int num=0;
                        while((num=fr.read())!=-1){
                                fw.write(num);
                                fw.flush();
                        }
                } catch (IOException e) {
                         throw new RuntimeException("读写失败");
                }finally{
                close(fr,fw);//调用close方法
                }
        }
        private static void close(FileReader fr,FileWriter fw){//关闭流的方法
                try {
                        if(fr!=null){
                        fr.close();
                        }
                } catch (IOException e) {
        throw new RuntimeException("Reader流关闭失败");
                }finally{
                        try {
                         if(fw!=null){
                             fw.close();
                             }       
                        } catch (IOException e) {
                                throw new RuntimeException("Writer流关闭失败");
                }
            }
        }
}
作者: 周世阳    时间: 2012-8-6 16:25
徐小骥 发表于 2012-8-6 15:52
public class FileCtrlC {
        private static FileReader fr=null;//声明reader流并初始化
        private static ...


生成3个IOTest.txt,我这里成功了,代码没问题

作者: 徐小骥    时间: 2012-8-6 16:27
周世阳 发表于 2012-8-6 16:25
生成3个IOTest.txt,我这里成功了,代码没问题

第三个文件里面没内容。。。你那第三个文件里有内容?
作者: 周世阳    时间: 2012-8-6 16:31
本帖最后由 周世阳 于 2012-8-6 16:35 编辑
徐小骥 发表于 2012-8-6 16:27
第三个文件里面没内容。。。你那第三个文件里有内容?

看到了  那是因为fr.read()已经读到文件IOTest的末尾了,在copy2里继续使用自然无法读出内容了


-->copy2中的while循环条件fr.read()直接等于-1不会执行了
作者: 徐小骥    时间: 2012-8-6 16:43
周世阳 发表于 2012-8-6 16:31
看到了  那是因为fr.read()已经读到文件IOTest的末尾了,在copy2里继续使用自然无法读出内容了

原来如此,谢谢
作者: 徐小骥    时间: 2012-8-6 16:43
问题已解决




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