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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐小骥 中级黑马   /  2012-8-6 15:00  /  1978 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 徐小骥 于 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后就被释放了?

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

9 个回复

倒序浏览
fr并没有被释放,但是一旦掉用了close()方法,操作系统分配给jvm的I/O资源就会被收回,所以fr必须重新引用一个分配了系统I/O资源FileWrite对象才能写入
回复 使用道具 举报
周世阳 发表于 2012-8-6 15:20
fr并没有被释放,但是一旦掉用了close()方法,操作系统分配给jvm的I/O资源就会被收回,所以fr必须重新引 ...

但是我修改代码,在copy1中不关闭流,copy2也没有拷贝出内容啊,这是怎么回事?
回复 使用道具 举报
徐小骥 发表于 2012-8-6 15:35
但是我修改代码,在copy1中不关闭流,copy2也没有拷贝出内容啊,这是怎么回事? ...

修改后的贴上来
回复 使用道具 举报
周世阳 发表于 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 15:52
public class FileCtrlC {
        private static FileReader fr=null;//声明reader流并初始化
        private static ...


生成3个IOTest.txt,我这里成功了,代码没问题
回复 使用道具 举报
周世阳 发表于 2012-8-6 16:25
生成3个IOTest.txt,我这里成功了,代码没问题

第三个文件里面没内容。。。你那第三个文件里有内容?
回复 使用道具 举报
本帖最后由 周世阳 于 2012-8-6 16:35 编辑
徐小骥 发表于 2012-8-6 16:27
第三个文件里面没内容。。。你那第三个文件里有内容?

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


-->copy2中的while循环条件fr.read()直接等于-1不会执行了

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
周世阳 发表于 2012-8-6 16:31
看到了  那是因为fr.read()已经读到文件IOTest的末尾了,在copy2里继续使用自然无法读出内容了

原来如此,谢谢
回复 使用道具 举报
问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马