文件夹的拷贝操作
要求:
完成文件夹的拷贝,包括子目录的拷贝和所有文件的拷贝
分析:
- 首先,得在目标目录下创建一个与源文件夹名称相同的文件夹
- 遍历源文件夹中的所有文件对象,判断子文件是目录还是文件
- 如果是目录,递归调用第一步的操作
- 如果是文件,用缓冲流文件字节流完成对文件的复制
- 创建源和目标File f = new File("路径");
- 创建输入流和输出流对象,肯定得传上面的源和目标
- 输入输出操作,输入操作得定义一个缓冲数组和定义一个返回读取长度的len
- 关闭流
- 完成
代码:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class CopyAllFile {
public static void main(String[] args) throws Exception {
//1.创建源和目标
File srcDir = new File("D:/资料/test");
File destDir = new File("D:/资料/test_copy");
if(!destDir.exists()){
destDir.mkdirs();
}
copy(srcDir,destDir);
}
public static void copy(File src,File dest) throws Exception{
if(src.isDirectory()){
//是目录,就在目标文件夹中创建与源文件夹相同名称的文件夹
File destDir = new File(dest,src.getName());
destDir.mkdir();
//列举出所有的文件对象
File[] fs = src.listFiles();
//遍历所有的文件对象
for (File file : fs) {
copy(file,destDir);
}
}else{
File file1 =new File(dest,src.getName());
copyFile(src,file1);
}
}
public static void copyFile(File inputFile,File outputFile) throws Exception{
BufferedInputStream in = new BufferedInputStream(new FileInputStream(inputFile));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outputFile));
byte[] buffer = new byte[1024];
int len = -1;
while((len = in.read(buffer)) != -1){
out.write(buffer, 0, len);
}
in.close();
out.close();
}
}
当然,也可以有这样的需求,比如,我只想复制.avi的视频文件,那么这时候就得有一个筛选器,java给我我们提供了:
File[] fs = dir.listFiles(FilenameFilter的实例)
必须覆盖类中的accept方法 boolean accept(File dir,String name){}
File[] fs = srcDir.listFiles(new FilenameFilter(){
@Override
public boolean accept(File dir, String name){
return new File(dir,name).isFile() && name.endsWith(".java");
}
});