Java复制文件的几种方式 (含具体的效率比较)

玩家互动 5909

package cn.itcast.chapter07.example06;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

/**

* BufferedInputStream和BufferedOutputStream 这两个流的用法

*/

public class Example06 {

public static void main(String[] args) throws Exception {

// 创建一个带缓冲区的输入流

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\IDEA-IO\\src\\五环之歌.mp3"));

// 创建一个带缓冲区的输出流

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\IDEA-IO\\des\\五环之歌.mp3"));

long begintime = System.currentTimeMillis(); // 获取拷贝文件前的系统时间

int len;

while ((len = bis.read()) != -1) {

bos.write(len);

}

long endtime = System.currentTimeMillis(); // 获取文件拷贝结束时的系统时间

System.out.println("拷贝文件所消耗的时间是:" + (endtime - begintime) + "毫秒");

bis.close();

bos.close();

}

}

输出

拷贝文件所消耗的时间是:94毫秒

4、字节缓冲流+缓冲区(效率最高)

package cn.scanner.cn.copyFile;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

/**

* @author wangyue

* @version 1.0

* @date 2019/7/4 17:10

* @describe: 测试拷贝文件的几种方法

*/

public class TestCopyFile {

public static void main(String[] args) throws Exception {

// 创建一个带缓冲区的输入流

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\IDEA-IO\\src\\五环之歌.mp3"));

// 创建一个带缓冲区的输出流

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\IDEA-IO\\des\\五环之歌.mp3"));

// 定义一个字节数组,作为缓冲区

byte[] buff = new byte[1024];

long begintime = System.currentTimeMillis(); // 获取拷贝文件前的系统时间

int len;

while ((len = bis.read(buff)) != -1) {

bos.write(buff, 0, len); // 从第一个字节开始,向文件写入len个字节

}

long endtime = System.currentTimeMillis(); // 获取文件拷贝结束时的系统时间

System.out.println("拷贝文件所消耗的时间是:" + (endtime - begintime) + "毫秒");

bis.close();

bos.close();

}

}

输出

拷贝文件所消耗的时间是:16毫秒

二、字符流复制文件

字符流也可以拷贝文本文件,但不推荐使用

因为读取时会把字节转为字符,写出时还要把字符转回字节

1、通过缓冲流完成文件的复制

使用BufferedReader和BufferedWriter完成文件的复制BufferedReader中的方法 public String readLine() 读一行字符BufferedWriter中的方法 public void newLine() 写入一个换行符

package cn.itcast.chapter07.example09;

import java.io.*;

/**

* 使用BufferedReader和BufferedWriter完成文件的复制

*

* BufferedReader中的方法

* public String readLine() 读一行字符

*

* BufferedWriter中的方法

* public void newLine() 写入一个换行符

*/

public class Example09 {

public static void main(String[] args) throws Exception {

// 创建一个BufferedReader缓冲对象,用于读取文件数据

BufferedReader in=new BufferedReader(new FileReader("D:\\IDEA-IO\\src\\五环之歌.mp3"));

// 创建一个BufferedWriter缓冲对象,用于写文件数据

BufferedWriter out=new BufferedWriter(new FileWriter("D:\\IDEA-IO\\des\\五环之歌.mp3"));

String line=null;

long begintime = System.currentTimeMillis();

// 每次读取一行文本,判断是否到文件末尾

while ((line = in.readLine()) != null) {

out.write(line);

out.newLine(); // 写入一个换行符,该方法会根据不同的操作系统生成相应的换行符

out.flush(); //也可以不写,在关闭数据流时,会自动刷新

}

long endtime = System.currentTimeMillis();

System.out.println("拷贝文件所消耗的时间是:" + (endtime - begintime) + "毫秒");

in.close();

out.close();

}

}

输出

拷贝文件所消耗的时间是:460毫秒

2、通过转换流复制文件

前面IO流可以分为字节流和字符流,有时字节流和字符流之间也需要进行转换。在JDK中提供了两个类可以将字节流转换为字符流,分别是InputStreamReader和OutputStreamWriterOutputStreamWriter是Writer的子类,它可以将一个字节输出流转换成字符输出流,方便直接写入字符,InputStreamReader是Reader的子类,它可以将一个字节输入流转换成字符输入流,

package cn.itcast.example10;

import java.io.*;

/**

* @author wangyue

* @version 1.0

* @date 2019/7/3 10:01

* @describe: 转换流:

*/

public class Example10 {

public static void main(String[] args) throws IOException {

//指定输入流

FileInputStream in = new FileInputStream("D:\\IDEA-IO\\src\\五环之歌.mp3");//创建字节输入流

InputStreamReader isr = new InputStreamReader(in); //将字节输入流转换成字符输入流

BufferedReader br = new BufferedReader(isr); //高效缓冲流包装

//指定输出流

FileOutputStream out = new FileOutputStream("D:\\IDEA-IO\\des\\五环之歌.mp3");//创建字节输出流

OutputStreamWriter osw = new OutputStreamWriter(out);

BufferedWriter bw = new BufferedWriter(osw);

//读数据

String line = null;

long begintime = System.currentTimeMillis();

while ((line = br.readLine()) != null) { //是否读到文件末尾

//写数据

bw.write(line);

bw.newLine();

bw.flush();

}

long endtime = System.currentTimeMillis();

System.out.println("拷贝文件所消耗的时间是:" + (endtime - begintime) + "毫秒");

//关闭流

br.close(); //只要关闭最后的缓冲流即可

bw.close();

}

}

输出

拷贝文件所消耗的时间是:545毫秒

注意事项

1.字符流也可以拷贝文本文件,但不推荐使用因为读取时会把字节转为字符,写出时还要把字符转回字节。

2.不可以拷贝非纯文本的文件

因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替;写出的时候会将字符转换成字节写出去,如果是?,直接写出,这样写出之后的文件就会产生乱码。

3.使用情况

程序需要读取一段文本,或者需要写出一段文本的时候可以使用字符流

读取的时候是按照字符的大小读取的,不会出现半个中文

写出的时候可以直接将字符串写出,不用转换为字节数组————————————————

原文链接:https://blog.csdn.net/wangpailiulanqi8/article/details/94631753