IO流-文件夹的拷贝

文件夹的拷贝操作

要求:

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

分析:

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