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();
}
}
}
}
}