【JAVA】編程(6)— 應用IO流拷貝文件夾(內含多個文件)到指定位置
- 2021 年 12 月 1 日
- 筆記
- Java-SE, JavaSE---練氣期
此程式應用了:
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方法結束
*/