Test_Java_File类递归练习(拷贝文件)

需求:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中

Test文件夹中包含两个文件夹,分别为src(原文件夹)和dest(目标文件夹)
这里写图片描述

在src的文件夹中包含若干个文件
这里写图片描述

dest文件夹为空文件夹
这里写图片描述

拷贝文件代码如下:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Scanner;

public class Test3 {
    /*
     * 需求:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
     * 
     * 分析:
     * 从键盘接收两个文件夹路径(对该方法调用两次)
     * 1.创建键盘录入对象
     * 2.定义一个无限循环
     * 3.将键盘录入的结果存储并封装成File对象
     * 4.对File对象判断
     * 5.将文件夹路径对象返回
     * 
     * 把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
     * 1.在目标文件夹中创建原文件夹
     * 2.获取原文件中所有的文件和文件夹,存储在File数组中
     * 3.遍历数组
     * 4.如果是文件就用io流读写(io只能读取文件,不能读取文件夹)
     * 5.如果是文件夹就递归调用
     */
    public static void main(String[] args) throws Exception {
        File src = getDir();
        File dest = getDir();
        //如果目标文件和原文件的路径相同,这可能会进入无限循环创建状态,直到内存爆炸,蓝屏死机为止
        if(src.equals(dest)){
            System.out.println("目标文件夹是原文件夹的子文件夹");
        }else{
            copy(src,dest);
        }
    }

    /*
     * 把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
     * 1.返回值类型void
     * 2.参数列表File src, File dest
     */
    public static void copy(File src, File dest) throws Exception {
        //1.在目标文件夹中创建原文件夹
        File newDir = new File(dest,src.getName());
        newDir.mkdir();
        //2.获取原文件中所有的文件和文件夹,存储在File数组中
        File[] subFiles = src.listFiles();
        //3.遍历数组
        for (File subFile : subFiles) {
            //4.如果是文件就用io流读写(io只能读取文件,不能读取文件夹)
            if(subFile.isFile()){
                BufferedInputStream bis = 
                        new BufferedInputStream(new FileInputStream(subFile));
                BufferedOutputStream bos = 
                        new BufferedOutputStream(new FileOutputStream(new File(newDir,subFile.getName())));
            int b;
            while((b = bis.read()) != -1){
                bos.write(b);
            }

            bis.close();
            bos.close();
            }else{
                //5.如果是文件夹就递归调用
                copy(subFile,newDir);
            }
        }
    }

    /*
     * 从键盘接收一个文件夹路径:
     * 1.返回值类型File
     * 2.参数列表无
     */
    public static File getDir(){
        //1.创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个文件夹路径:");
        //2.定义一个无限循环
        while(true){
            //3.将键盘录入的结果存储并封装成File对象
            String line = sc.nextLine();
            File dir = new File(line);
            //4.对File对象判断
            if(!dir.exists()){
                System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径:");
            }else if(dir.isFile()){
                System.out.println("您录入的是文件夹路径,请输入一个文件路径:");
            }else{
                //5.将文件夹路径对象返回
                return dir;
            }
        }
    }
}

执行该程序
这里写图片描述

查看dest文件夹中多了一个src文件夹,在src中包含了其中的内容
这里写图片描述

注意:如果原文件夹和目标文件夹的路径相同,即在同一个文件夹下不停地复制相同的文件夹,系统会崩溃。因此,要在调用copy()方法之前,首先要进行判断。

//如果目标文件和原文件的路径相同,这可能会进入无限循环创建状态,直到内存爆炸,蓝屏死机为止
        if(src.equals(dest)){
            System.out.println("目标文件夹是原文件夹的子文件夹");
        }else{
            copy(src,dest);
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章