IO流實現文件夾拷貝
分爲3個步驟進行實現:
一、判斷
二、複製文件夾
三、複製文件
==================================判斷地址是否條件需求==================================
/*條件:
1:倆個地址文件夾是否存在
2:目的地不能是相同目錄下(相同目錄一下不能存在相同名字的文件夾)
3:目的地不能是 拷貝文件的子目錄
*/
public static void panDuan(String a, String b) {//重寫方法,當傳入的地址是字符串時轉爲flie對象調用相應的方法
panDuan(new File(a),new File(b));
}
public static void panDuan(File a, File b) {
String s = a.getAbsolutePath().toString();// a(數據源)絕對地址轉爲字符串
String s2 = b.getAbsolutePath().toString();// b(目的地)絕對地址轉爲字符串
String s1 = s.substring(0, s.lastIndexOf("\\"));// 取數據源最後一個 \ 之前的字符串
if (a.isDirectory() && b.isDirectory()) {//判斷給的倆個路徑是否正確
if (!(s2.equals(s1) || s2.equals((s1 + "\\")))) {// 判斷文件拷貝的地址是不是當前文件所在路徑下
System.out.println("驗證1通過");
if (!s2.contains(s)) { // 判斷s2 是否有s這個字符串(用來判斷是否複製到了文件的子文件下)
System.out.println("驗證2通過");
System.out.println("開始拷貝...");//滿足以上要求再調用文件拷貝方法
cd02(a, b);
} else {
System.out.println("警告!不能拷貝到當前文件夾子目錄下!!");
}
} else {
System.out.println("警告!不能拷貝到當前文件夾路徑下!!");
}
}else System.out.println("警告!路徑非法!!");
}
====================================複製文件夾=======================================
public static void cd02(File f1, File f2) {
File[] f11 = f1.listFiles();//創建f1路徑下文件名的數組
File f4 = new File(f2.getAbsolutePath() + "/" + f1.getName());// 拼接目的地文件名
if (!f4.exists()) { // 判斷目的地是否有該文件 沒有就創建
f4.mkdir();
}
// System.out.println(f4);//可以打印判斷下是否拼接正確
int a = 0, b = 0;
for (File j : f11) {//使用增強for遍歷
if (j.isDirectory()) { //isDirectory()判斷是否爲文件夾
cd02(new File(f1 + "\\" + j.getName()), f4);// 遍歷目標源目錄中有文件夾則用該文件夾地址重新調用cd02方法,實現遞歸
a++;
}
if (j.isFile()) {// isFlie()判斷是文件類型則調用文件拷貝
Copy(j,f4);// 調用Copy方法拷貝文件
}
}
b++;
if (a == b) {//當a和b相等的時候說明所有文件夾中已經全部拷貝完畢
System.out.println("拷貝完成!!!!");
}
}
====================================複製文件============================================
public static void Copy(File f, File f1) {
InputStream s = null;//多態定義讀取空對象,提高寫入效率
OutputStream out = null;//多態定義輸出空對象,提高寫入效率
try {
s = new FileInputStream(f);//把傳入的file目標地址賦值給讀取對象
File file = new File(f1.getPath() + File.separator + f.getName());//拼接 目的地 的該文件地址+文件名
out = new FileOutputStream(file);//把地址+文件名 賦值給 字節 輸出對象 有文件則直接複製內容,沒有文件則會自動創建文件夾並複製
int a = -1;
try { //while循環實現文件的拷貝
while ((a = s.read()) != -1) {//read() 讀取,讀取不到時會返回-1
out.write(a); //write() 輸出
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
out.flush();//輸出字節時有可能有殘留,清理io流通道殘留的字節
out.close();//關閉輸出資源
s.close();//關閉寫入資源 注意! 後開先關
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}