黑马程序员技术交流社区

标题: 从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 [打印本页]

作者: li--yong    时间: 2016-8-22 12:02
标题: 从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;

public class homework1 {
    public static boolean falg = true;
        public static void main(String[] args) throws Exception {
               
                //出于代码复用性的考虑,应将重复的代码抽取成一个方法
        //        String readStrForConsole = readStrForConsole();
        //        File souFile = new File(readStrForConsole);  与下边等价
               
                File souFile = new File(readStrForConsole());
                File desFile = new File(readStrForConsole());
                //判断是否是一个文件夹,如果不是一个文件夹,则输入程序错误 -->健壮性的考虑
                if(!souFile.isDirectory() || !desFile.isDirectory()){
                         System.out.println("您输入的路劲有误");
                }else{
                        //走到这里表示数据符合要求,都是文件夹,进行拷贝
                        copyDirToDir(souFile,desFile);
                }
               
               
        }

        private static void copyDirToDir(File souFile, File desFile) throws Exception {
                //拿到源目录的所有子文件为做拷贝做准备
          File[] listFiles = souFile.listFiles();
          //遍历,拿到源目录的所有子文件
          for (File thisFile : listFiles) {
                  
                          if(thisFile.isFile()){
                                  //表示是一个文件
                                 //创建流对象,反复的读取,应该读取的是遍历到的对象thisFile
                                  FileInputStream fis = new FileInputStream(thisFile);
                                  //写: 应该写到目的地址中去,
                                  //拷贝: D:\\a --->D:\\aa      
                                  //   D:\\a\bb.txt   --->D:\\aa\bb.txt(这是想要的file文件路劲)
                                  //     就是目的地址的路劲 +  \  + 源地址的名称
                                  FileOutputStream fos = new FileOutputStream(desFile.getPath()+File.separator+thisFile.getName());
                                 //一次创建合适大小的数组,一次性就能写好
                                     // 优点:
                                          //书写简单,长度正好合适
                                     // 缺点:
                                          //当需要拷贝的文件长度过大时,开辟数组浪费资源
                                          //当需要拷贝的文件长度过大时,内存可能不够
                                  byte [] bytes  =  new byte[fis.available()];
                                  fos.write(bytes);
                          }else{
                                  //是一个文件夹
                                  //需要创建一个文件
                                  File desDir = new File(desFile.getPath()+File.separator+thisFile.getName());//   D:\\a\\aa\\a     D:\\b\\aa
                                  desDir.mkdir();//创建一个文件
                                  // 递归调用
                                  copyDirToDir(thisFile,desDir);
                          }
                }
        }
        private static String readStrForConsole() {
                //定义了一个boolean静态变量falg;
                Scanner sc = new Scanner(System.in);
                if(falg){
                        //默认值是true ,第一次走这里
                        System.out.println("请输入源文件");
                        //因为第二次调用,要走else,所以将falg改为false;
                        falg =false;
                }else{
                        System.out.println("请输入目标文件");
                }
                //将值返回
                return sc.nextLine();
        }
}





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