思路
考虑到文件夹文件内容多样性,选择字节流,同时要求效率,因此选择缓冲字节流;文件夹复制的本质还是每个文件的复制,当遍历文件夹时遇到文件夹文件时,需要递归深入遍历文件夹,直至到达文件的复制;因此我们需要一个文件复制方法,和一个递归遍历文件夹的方法。
实例
import java.io.*;
public class Copy {
public static void main(String[] args) throws IOException {
File file1 = new File("D:\\test\\a"); //源目录
File file2 = new File("D:\\test\\taget"); //目标目录
copyDir(file1,file2);
}
static void copyDir(File srcFile , File tagetFile) throws IOException { //遍历源目录
if(!tagetFile.exists()){ //若不存在目标目录,则创建目标目录
tagetFile.mkdirs();
}
File[] files = srcFile.listFiles(); //导出目录中的所有文件,返回值为文件类型数组
for (File f:files) {
if(f.isFile()){ //若为文件,直接复制,调用文件复制方法,注意文件路径的改变
copyFile(new File(srcFile+"\\"+f.getName()),new File(tagetFile+"\\"+f.getName()));
}else{ //若为目录,则递归深入遍历,注意目录文件的改变
copyDir(new File(srcFile+"\\"+f.getName()),new File(tagetFile+"\\"+f.getName()));
}
}
}
static void copyFile(File srcFile,File tagetFile) throws IOException { //文件复制
FileInputStream fileInputStream = new FileInputStream(srcFile);
FileOutputStream fileOutputStream = new FileOutputStream(tagetFile);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
byte[] bytes = new byte[1024]; //缓冲字节数组
int read = fileInputStream.read(bytes);
while (read!=-1){ //复制文件内容
bufferedOutputStream.write(bytes,0,read);
read = fileInputStream.read(bytes);
}
bufferedOutputStream.close(); //关闭流
bufferedInputStream.close();
fileOutputStream.close();
fileInputStream.close();
}
}