需求:实现文件夹复制
需求分析:
- 复制一个目录中的所有内容到指定目录
- 目录中有目录的情况,需要再进入子目录复制子目录的内容,递归调用即可
- 给定两个路径File对象,一个为要复制的文件夹,一个为目标路径
- 定义复制文件的方法,在复制目录的方法中判断:如果是文件就复制,如果是文件夹就递归调用本方法,再加上异常抛出判断,如:给定的File参数不能为null或目标路径不能是文件
import java.io.*;
public class CopyDir{
public static void main(String[] args) {
//要复制的文件路径的File对象
File copyDir = new File("F:\\下载");
//目标路径的File对象
File pasteDir = new File("F:\\io");
//调用复制文件方法,把参数传进去 (try...catch处理)
try {
copyPasteDir(copyDir,pasteDir);
} catch (IOException e) {
e.printStackTrace();
}
}
//复制文件夹方法
private static void copyPasteDir(File copyDir, File pasteDir) throws IOException {
//异常判断 并在控制台抛出
if (copyDir == null || pasteDir == null) {
throw new RuntimeException("参数不能为空!");
}
if (pasteDir.isFile()) {
throw new RuntimeException("目标路径不能是文件!");
}
//判断是文件还是目录
//如果是文件
if (copyDir.isFile()) {
//获取要复制的文件名称,在目标路径中创建同名文件
String name = copyDir.getName();
File newFile = new File(pasteDir, name);
//调用复制文件方法,参数为本文件和目标路径新创建的同名文件
copyPasteFile(copyDir, newFile);
}
//如果是目录
else if (copyDir.isDirectory()) {
//获取要复制的文件夹名称,在目标路径中创建同名文件夹
String name = copyDir.getName();
File newFile = new File(pasteDir, name);
//如果该文件夹不存在,创建该文件夹
if (!newFile.exists()) {
newFile.mkdirs();
}
//把本目录的所有文件或文件夹存储到File数组中
File[] dir = copyDir.listFiles();
//循环递归调用复制文件夹方法,直到复制完毕所有的File对象
for (File childDirs : dir) {
copyPasteDir(childDirs, newFile);
}
}
}
//复制文件方法
private static void copyPasteFile(File copyFile, File pasteFile) throws IOException {
//创建字节数输入流和字节输出流(字符流不可以复制图片视频等)
FileInputStream fis = new FileInputStream(copyFile);
FileOutputStream fos = new FileOutputStream(pasteFile);
//实现文件复制就是循环边读边写的过程
int data;
while ((data = fis.read()) != -1) {
fos.write(data);//边读边写
fos.flush();//刷新流
}
//关闭流
fis.close();
fos.close();
}
}
注意:
- 只需要把main方法中File对象的路径的更改为自己电脑上的路径即可
- 复制文件最好用字节流,字符流复制图片视频音乐等文件可能会出现问题
- 异常最好不要抛给main方法,try…catch处理即可,如果普通方法不想往上抛异常,把普通方法的所有代码块放到try…catch里的第一个大括号里即可
欢迎评论补充~