文件拷贝使用io流将一个指定目录文件拷贝到另一个磁盘的位置上

涉及知识点:缓冲流、文件字符流、File类、获取当前系统时间毫秒值、异常处理
编写时间:2019/7/20

具体思路如下:
1、先从简单的入手,考虑一下如何复制文件?所以我们创建一个类之后,可以先编写一个拷贝文件的方法,有两个参数:分别为:被拷贝文件路径和终点位置。流的输入输出概念是针对程序而言的,所以我们要先从起点位置将内容复制到程序中,可以使用FileInputStream,也可以使用缓冲字符流将FileInputStream放进BufferedInputStream的参数中。其作用在于提高读写效率。接着我们用一个大一点的byte数组去接收。定义一个int类型变量接收read()方法的字节数作判断,当等于-1时,说明数据读完了。同时,在读的时候也就是在while循环的时候使用BufferedOutputStream的write方法写入目标地址。

2、文件复制解决了,那如果我们要复制的是目录呢?如果我们还用上面那个方法,回报该目录拒绝访问的错误。所以我们再编写一个方法,该方法中首先判断一下该目录是否存在,使用exists()方法进行判断,若不存在则调用mkdir()方法创建目录(mkdirs()方法用于创建多级目录)。是目录则使用listFiles()方法获取指定目录下的所有文件。该结果是一个数组,所以可以使用加强for循环(for-each)遍历。也可以用普通for循环。由于目录里面可能还会有目录,所以再循环中还要进行一次是不是文件的判断,是文件,则可以复用刚刚编写的拷贝文件的方法。如果不是,则自己调用自己。是一个递归思想。

3、最后编写main方法,创建两个file,传入对应地址,调用相对于方法即可。具体代码如下:

package com.bjsxt.interface1;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class TextCopyFile {
	public static void main(String[] args) {
		File file1=new File("D:\\笔记\\笔记");//被复制的文件地址
		File file2=new File("F:\\笔记");//目的地
		//copyFile(file1,file2);测试复制文件是否可以成功
		long start=System.currentTimeMillis();//获取当前系统毫秒值
		copyDir(file1,file2);
		long end=System.currentTimeMillis();
		System.out.println(end-start);//将量毫秒值相减就是复制文件一共执行的时间
	}

	private static void copyDir(File file1, File file2) {
		//先判断目标文件是否存在
		if(!file2.exists()) {
			file2.mkdir();
		}
		//获取指定目录下的所有文件
		File[] f = file1.listFiles();
		for (File file : f) {
			if(file.isFile()) {//如果该文件是文件,则进行拷贝
				copyFile(new File(file1+"\\"+file.getName()),new File(file2+"\\"+file.getName()));
			}else {//不是文件,则递归调用该方法本身
				copyDir(new File(file1+"\\"+file.getName()),new File(file2+"\\"+file.getName()));
			}
		}
	}

	private static void copyFile(File file1, File file2) {
		BufferedInputStream bis=null;
		BufferedOutputStream bos=null;
		try {
			bis = new BufferedInputStream(new FileInputStream(file1));
			bos = new BufferedOutputStream(new FileOutputStream(file2));
			byte[] buf=new byte[1024];
			int len=0;
			while((len=bis.read(buf))!=-1) {
				bos.write(buf,0,len);
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(bos!=null) {
				try {
					bos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(bis!=null) {
				try {
					bis.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
	}
}

执行结果图:

如何将文件复制到容器外 把文件复制到其他盘_System


以下是不使用缓冲流进行文件复制的代码。效率很低。感兴趣的可以用System.currentTimeMillis()方法测试下拷贝所用时间。

private static void copyFile(File fstart, File fend) {
			FileInputStream fis=null;
			FileOutputStream fos=null;
			try {
				fis = new FileInputStream(fstart);
				fos = new FileOutputStream(fend);
				byte[] buf=new byte[1024];
				int len=0;
				while((len=fis.read())!=-1) {
					fos.write(buf,0,len);
				}
			} catch (FileNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}finally {
				if(fos!=null) {
					try {
						fos.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				if(fis!=null) {
					try {
						fis.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}					
	}