复制文件夹D:/java下面所有文件和子文件夹内容到D:/java2
涉及到单个文件复制、目录的创建、方法的递归调用
package homework;
import java.io.*;
public class dirCopyDemo {
public static void main(String[] args) throws IOException {
File file = new File("D:\\java");
// 创建复制后的文件夹
new File("D:\\java2");
dirCopy(file);
}
static void dirCopy(File file) throws IOException {
// 以文件的形式提取接受的文件夹里的所有内容 (包括子文件夹及文件)
File[] files = file.listFiles();
// 对提取到的每个文件进行遍历
for (File f : files) {
// 创建复制后的文件路径
// 由于复制后的父路径发生了变化
// 所以需要提取到的原本文件的绝对路径的前一部分替换成复制后的父路径
String copyPath = "D:\\java2" +
f.getAbsolutePath().substring(7, f.getAbsolutePath().length());
// 判断本轮遍历的file是文件还是文件夹, 并分别进行操作
if (!f.isDirectory()) {
// 文件则使用buffer缓冲进行复制
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(f.getAbsolutePath()));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(copyPath));
byte[] bys = new byte[1024];
int len;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}
// 手动倒序关闭资源
bos.close();
bis.close();
} else {
// 文件夹则直接在新路径新建文件夹
File copyFile = new File(copyPath);
copyFile.mkdirs();
// 递归调用方法将子文件及其内容进行复制
dirCopy(f);
}
}
}
}
学习思考:代码逻辑还不是很清晰,在调试递归方法是经常会被绕进去,其实有时候走出逻辑的闭环,更容易理清递归逻辑。调试过程中一直遇到的路径找不到的错误都是由于方法的类对象搞混的低级错误,提醒我们要养成注释及时标注的习惯。