需求:從鍵盤接收兩個文件夾路徑,把其中一個文件夾中(包含內容)拷貝到另一個文件夾中
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);
}