黑马程序员技术交流社区

标题: 求助解决文件复制的问题 [打印本页]

作者: smhjx2006    时间: 2013-6-5 19:17
标题: 求助解决文件复制的问题
/**问题描述:将d:\ceshi 目录下的所有.java 文件复制到d:\ch 目录下
*下面的程序,调试了很长时间,发现结果只是复制了d:\ceshi目录中的java文件,
*但是却没有复制该路径里面所包含的子文件夹中的java文件。不知哪里的问题?请求帮助
*/
package com.itheima;
import java.awt.List;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
public class Test9 {
      public static void main(String[] args) {        
              //定义目录dir
              File dir = new File("d:\\ceshi\\");
              //定义集合al用于存放dir目录中的所有java文件的绝对路径
              ArrayList<String> al = new ArrayList<String>();
              //调用getAllJavaFile方法,该方法会将所有java文件的绝对路径存入al集合中,并以字符串数组的形式返回
              String[] arr = getAllJavaFile(dir,al);
              //遍历字符串数组arr,并将数组元素封装成File对象传递给copyJavaFile方法,该方法实现java文件的复制
              for(String str :arr)
              {
                     copyJavaFile(new File(str));
              }
              
       }
       //定义方法copyJavaFile(),实现file文件的复制
       public static void copyJavaFile(File file) {
              //String name = file.get
              File dir = new File("d:\\ch\\");
              if(!(dir.isDirectory()&&dir.exists()))
                     dir.mkdirs();
              BufferedReader bufr = null;
              BufferedWriter bufw = null;
              String line = null;
              try{
                     bufr = new BufferedReader(new FileReader(file));
                     bufw = new BufferedWriter(new FileWriter(new File(dir,file.getName())));
                     while((line = bufr.readLine())!=null){
                            bufw.write(line);
                            bufw.newLine();
                            bufw.flush();
                     }                  
              }
              catch(IOException e){
                     throw new RuntimeException("读写失败");
              }
              finally{
                     if(bufr!=null){
                            try{
                                   bufr.close();
                            }
                            catch(IOException ex){
                                   throw new RuntimeException("关闭读取失败!");
                            }
                     }
                     if(bufw!=null){
                            try{
                                   bufw.close();
                            }
                            catch(IOException ex){
                                   throw new RuntimeException("关闭写入失败");
                            }
                     }
              }
       }     
       //定义方法获取指定目录下所有java文件的方法getAllJavaFile()
       public static String[] getAllJavaFile(File dir,ArrayList<String> al){
              if(!(dir.exists()&&dir.isDirectory()))
                     throw new RuntimeException("目录不存在或者不是目录");
              ArrayList<String> al1 = new  ArrayList<String>();
              File[] files = dir.listFiles();
              for(int x=0; x<files.length; x++){
                     if(files[x].isDirectory())
                            getAllJavaFile(files[x],al1);
                     else{
                            if(files[x].getName().endsWith(".java")){
                                   al.add(files[x].getAbsolutePath());      
                            }
                     }
              }
       return al.toArray(new String[al.size()]);
       }
      
}

作者: eycrckag    时间: 2013-6-5 19:23
你的代码貌似没有问题哦,你仔细看看是不是路径问题。可以先把复制的目的改成当前目录,就是现在的路径。相对路径试试,一般情况下,复制文件,就是路径容易出问题。最后再改成绝对路径。
作者: 苑永志    时间: 2013-6-15 16:27
哥们,我替你找到错误了,下面有错误的代码段:ArrayList<String> al1 = new  ArrayList<String>();
File[] files = dir.listFiles();
for(int x=0; x<files.length; x++){
        System.out.println(files[x]);
       if(files[x].isDirectory()){
               getAllJavaFile(files[x],al1);
       }else{
              if(files[x].getName().endsWith(".java")){
                     al.add(files[x].getAbsolutePath());      
              }
       }
}

估计这样楼主已经可以看出问题的所在了,就是每次执行getAllJavaFile时,都会在代码块中重新创建一个新的ArrayList对象。
实际上,最后返回的只是第一层目录得到的所有文件的路径。可做如下的更改:
//ArrayList<String> al1 = new  ArrayList<String>();
File[] files = dir.listFiles();
for(int x=0; x<files.length; x++){
        System.out.println(files[x]);
       if(files[x].isDirectory()){
               getAllJavaFile(files[x],al);//无论哪一层目录中文件的路径都存放在这一个ArrayList对象中
       }else{
              if(files[x].getName().endsWith(".java")){
                     al.add(files[x].getAbsolutePath());      
              }
       }
}


作者: smhjx2006    时间: 2013-6-16 18:04
非常感谢!终于知道问题出在哪了!{:soso_e156:}
作者: 苑永志    时间: 2013-6-16 22:55
smhjx2006 发表于 2013-6-16 18:04
非常感谢!终于知道问题出在哪了!

呵呵,不用客气,互相学习




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