文件拷贝的流实现的几种方式

1.通过BufferedReader和PrintWriter:

package print;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
/**
 * 将本.java文件复制到copy.java中去 数据源: CopyFileDemo.java FileReader -- BufferedReader
 * 
 * 目的地: Copy.java FileWriter -- BufferedWriter
 * 
 * @author 半步疯子
 *
 */
public class CopyFileDemo {
	public static void main(String[] args) throws IOException {
		/*
		// 创建读数据的流
		BufferedReader br = new BufferedReader(new FileReader("src/print/CopyFileDemo.java"));
		// 创建目的地的流
		BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));

		String line = null;
		while ((line = br.readLine()) != null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		
		bw.close();
		br.close();
		*/
		// 打印流的改进版本
		BufferedReader br = new BufferedReader(new FileReader("src/print/CopyFileDemo.java"));
		PrintWriter pw = new PrintWriter(new PrintWriter("Copy.java"));
		// this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush);
		// 本身也做了高效的处理
		String line = null;
		while((line = br.readLine()) != null) {
			pw.println(line);
		}
		br.close();
		pw.close();
	}
}

2.通过BuffedInputStream和BufferedOutputStream,一个手动buffer:

package stream.file;

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

public class FileCopy3 {
	public static void main(String[] args) {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		// 给input 和 output也创建一个缓冲区
		// read和write操作就直接对它们的缓冲区进行操作
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		try {
			 fis = new FileInputStream("E:\\安装包\\mysql-5.6.31-winx64.zip");
			 fos = new FileOutputStream("a.rar");
			 bis = new BufferedInputStream(fis);
			 bos = new BufferedOutputStream(fos);
			 // 创建一个缓冲区
			 // 缓冲区越大,copy的速度越快,最快速度为缓冲区大小等于copy文件大小的时候
			 byte[] buffer = new byte[1024*8];
			System.out.println("文件正在复制,请稍后...");
			long begin = System.currentTimeMillis();
			while(true) {
				/*
				 *  read方法返回的是一个int值
				 *  表示读入缓冲区(buffer)的字节总数
				 *  因为各种方面的原因,read到缓冲区中
				 *  的字节数不一定每次都装满了len长度。
				 *  如果当前源文件中不存在可以读的字节
				 *  的时候,read的返回值为-1。
				 */
				int len = bis.read(buffer);
				if(len<0) {
					break;
				}
				bos.write(buffer, 0, len);
			}
			long end = System.currentTimeMillis();
			System.out.println("文件复制完成,耗时:"+(end-begin)+"毫秒");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 关闭的顺序必须先关闭in和out的缓冲区再关闭in和out
			if(bos != null) {
				try {
					bos.close();
				} catch (IOException e) {					
					e.printStackTrace();
				}
			}
			if(bis != null) {
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(fis != null) {
				try {
					fis.close();
				} catch (IOException e) {					
					e.printStackTrace();
				}
			}
			
		}
		
	}
}


posted @ 2018-05-18 21:12  五彩世界  阅读(395)  评论(0编辑  收藏  举报