IO流-文件夹的拷贝

时间:2021-12-28 23:03:57

文件夹的拷贝操作

要求:

完成文件夹的拷贝,包括子目录的拷贝和所有文件的拷贝

分析:

  • 首先,得在目标目录下创建一个与源文件夹名称相同的文件夹
  • 遍历源文件夹中的所有文件对象,判断子文件是目录还是文件
  • 如果是目录,递归调用第一步的操作
  • 如果是文件,用缓冲流文件字节流完成对文件的复制
    • 创建源和目标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");
    }
});