需求:複制多級檔案夾
資料源: D:/Java/data
目的地: D:/Java/user
分析
A:封裝資料源 (資料源是你知道路徑和名字的檔案)
B:封裝目的地 (是你最終複制過去的檔案夾的父路徑)
C: 建立一個方法用于複制檔案夾
D:在C方法中判斷該File是檔案還是檔案夾
a:是檔案夾
就在目的地下建立該檔案夾
擷取該File對象的所有檔案或者檔案夾對象
周遊得到每一個File對象
使用遞歸(再次調用D方法)
b:是檔案
複制檔案(前提是有一個和源檔案一樣的檔案名,或者不存在的路徑,位元組流複制的時候沒有檔案會建立一個)
public class Copy {
public static void main(String[] args) {
File srcFile = new File("D:/Java/data");//源檔案對象。明确路徑的檔案
File descFile = new File("D:/Java/user");//将源檔案複制到這個目錄下,複制過來會在此目錄下有一個和源檔案名一樣的檔案
copyFolder(srcFile,descFile);
}
//複制檔案的方法
private static void copyFolder(File srcFile, File descFile) {
String srcName = srcFile.getName();//擷取源檔案名
if (srcFile.isDirectory()){//是檔案夾進入次目錄
File file = new File(descFile,srcName);//通過構造方法(父類的路徑,檔案名對象)建立目錄對象
file.mkdir();//建立目錄
File[] files = file.listFiles();
for (File f : files){
copyFolder(f,file);//周遊得到file目錄下所有的對象,然後判斷是檔案夾,還是檔案,是以自己調用自己的方法(遞歸)
}
}else {//是檔案,直接複制
File file = new File(descFile,srcName);//封裝一個和源檔案名一樣的對象,使用流建立時會自動建立該檔案
copyFile(srcFile,file);
}
}
//使用流複制檔案
private static void copyFile(File srcFile, File file) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(file);
byte[] bytes = new byte[1024];
int len;
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}