要求:
把D盘当中的目录(文件夹)拷贝到某盘当中 (注意:D盘目录当中有可能还是目录)
思路:
第一步:先利用递归直接全部是文件的时候结束
第二步:递归的时候会遍历目录,此时可以把拷贝目标(某盘)的目录(文件夹)创建出来
第三步:在递归结果是文件的地方可以把文件依次写入拷贝目标对应的目录下
代码演示如下:
package com.bjpowernode.java.io;
import java.io.*;
public class CopyAllFile {
public static void main(String[] args) {
// 拷贝源
File srcFile =new File("D:\\java course\\copy测试目录");
// 拷贝目标
File destFile =new File("C:\\");
// 调用拷贝方法
copyDir(srcFile,destFile);
}
private static void copyDir(File srcFile, File destFile) {
if (srcFile.isFile()){ // 当递归结果为文件的时候结束
// 程序能走到这里 说明是文件 文件的话我们就可以进行文件拷贝 (第三步)
FileInputStream in =null;
FileOutputStream out =null;
try {
in =new FileInputStream(srcFile); // 把每次读过来的文件读入内存
String a =srcFile.getAbsolutePath();
// 拿到文件srcFile的绝对路径 D:\java course\copy测试目录\copy测试目录1\copy测试目录1当中的文件1.txt 格式
// 因为C盘当中的文件夹在第二步已经创建完成,所以此时只需要拼接字符串到C盘写入文件即可
String b =a.substring(3); // java course\copy测试目录\copy测试目录1\copy测试目录1当中的文件1.txt
String c = destFile.getAbsolutePath() +b; // C:\java course\copy测试目录\copy测试目录1\copy测试目录1当中的文件2.txt
out =new FileOutputStream(c);
// 边读边写
byte[] bytes =new byte[1024*1024];
int readCount =0;
while ((readCount =in.read())!=-1){
out.write(bytes,0,readCount); // 写
}
// 刷新管道
out.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关流
if (in != null) {
try {
in.close();
System.out.println("关流成功~");
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
System.out.println("关流成功~");
} catch (IOException e) {
e.printStackTrace();
}
}
}
return;
}
// 拿到拷贝源首先我们可以拿到目录的子文件
File[] files =srcFile.listFiles();
for (File fileData :files){ // 依次遍历数组里面的子文件
// 创建相对应的目标目录 (第二步)
if (fileData.isDirectory()){
// System.out.println(fileData.getAbsolutePath()); // 代码测试:D:\java course\copy测试目录\copy测试目录1
// 源文件:D:\java course\copy测试目录\copy测试目录1 目标文件:C:\java course\copy测试目录\copy测试目录1
String a =fileData.getAbsolutePath(); // D:\java course\copy测试目录\copy测试目录1
// 创建相对应的目标目录
// 通过substring方法 获得 java course\copy测试目录\copy测试目录1 格式
String b =a.substring(3); // java course\copy测试目录\copy测试目录1
// 拼接字符串
// 拼接成C:\java course\copy测试目录\copy测试目录1 格式
String c =destFile.getAbsolutePath() +b; // C:\java course\copy测试目录\copy测试目录1 格式
File file =new File(c);
if (!file.exists()){
// 判断C盘下是否有该格式目录 没有的话以目录形式新建
file.mkdirs();
}
}
// System.out.println(fileData.getAbsolutePath()); // 绝对路径 代码测试
// 拿到的fileData可能是目录也可能是文件
// 运用递归 当遍历最终为文件时结束 (第一步)
copyDir(fileData,destFile);
}
}
}
C盘: