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);
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章