【JAVA】編程(6)— 應用IO流拷貝文件夾(內含多個文件)到指定位置

此程式應用了:

File 類,及其常用方法;

FileInputStream,FileOutputStream類及其常用方法;

遞歸思維;


package com.bjpowernode.javase.io;
import java.io.*;
public class IOTest {
    public static void main(String[] args) {
        //拷貝源路徑:...\\pra\\...
        File srcFile=new File("C:\\java-prictice\\javaseplus\\pra");
        //拷貝目標:...\\c\\...
        File destFile=new File("C:\\a\\b\\c");
        //若拷貝目標路徑不存在,創建多級文件夾
        if (!destFile.exists()){
            destFile.mkdirs();
        }
        //調用拷貝方法
        copyDir(srcFile,destFile);
    }
    private static void copyDir(File srcFile,File destFile){
        //聲明空指針引用
        FileInputStream fis=null;
        FileOutputStream fos=null;
        //遞歸的結束條件(拷貝源是文件,沒有子文件了)
        if (srcFile.isFile()){
            try {
                //位元組輸入流綁定拷貝源,位元組輸出流綁定拷貝目標
                fis=new FileInputStream(srcFile);
                //獲取不包含上級路徑的文件名
                String scrDir=srcFile.getName();
                //在拷貝目標的路徑後 +  「\\拷貝源的文件名」(不包含上級路徑)
                fos=new FileOutputStream(destFile.getAbsolutePath().endsWith("\\")?destFile.getAbsolutePath():(destFile.getAbsolutePath()+"\\"+scrDir));
                //一次最多讀取1MB
                byte [] bytes=new byte[1024*1024];
                int readCound;
                //文件拷貝完成
                while ((readCound=fis.read(bytes))!=-1){
                    fos.write(bytes);
                }
                fos.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            finally {
                if (fis!=null){
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fos!=null){
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return;
        }
        //能到這說明是文件夾,獲取文件夾下的所有子文件
        File [] files=srcFile.listFiles();
        for (File file:files) {
            //子文件若是文件夾,則新建此文件夾
            if (file.isDirectory()){
                String srcDir=file.getAbsolutePath();
                String destDir=(destFile.getAbsolutePath().endsWith("\\")?destFile.getAbsolutePath():destFile.getAbsolutePath()+"\\"+srcDir.substring(3));
                File newFile=new File(destDir);
            }
            //遞歸
            copyDir(file,destFile);
        }
    }
}

 

效果展示:


運行前:

 

運行後:

 

心得:


遞歸方法中的  copyDir ( file , destFile ) ; // 內部執行的拷貝順序:

/*拷貝順序:
1.pra的第一個子文件夾(若是文件則進行pra下一個子文件的拷貝)
2.上一個子文件夾的第一個子文件夾(若是文件則返回步驟1)
3.上一個子文件夾的第一個子文件夾(若是文件則返回步驟2)
......
n.上一個子文件夾的第一個子文件夾(若是文件則返回步驟「n-1」)
最後,pra的最後一個子文件拷貝完成/
        pra的最後一個子文件夾中的最後一個文件拷貝完成/
            pra的最後一個子文件夾的最後一個文件夾的最後一個文件拷貝完成!
      所有遞歸方法結束,copyDir方法結束
*/