四种复制文件的方法

时间:2021-03-20 17:19:43
  1 package com.hxl;
  2 
  3 import java.io.BufferedInputStream;
  4 import java.io.BufferedOutputStream;
  5 import java.io.FileInputStream;
  6 import java.io.FileOutputStream;
  7 import java.io.IOException;
  8 
  9 public class Test {
 10     public static void main(String[] args) throws IOException {
 11         long start = System.currentTimeMillis();
 12         // 测试文件大小为3.12MB
 13         // 运行耗时:21707毫秒
 14         method1("E:\\EditPlus4.3安装程序及说明.zip", "C:\\Users\\Administrator\\Desktop\\EditPlus4.3安装程序及说明.zip");
 15         // 运行耗时:76毫秒
 16         // method2("E:\\EditPlus4.3安装程序及说明.zip", "C:\\Users\\Administrator\\Desktop\\EditPlus4.3安装程序及说明.zip");
 17         // 运行耗时:294毫秒
 18         // method3("E:\\EditPlus4.3安装程序及说明.zip", "C:\\Users\\Administrator\\Desktop\\EditPlus4.3安装程序及说明.zip");
 19         // 运行耗时:54毫秒
 20         // method4("E:\\EditPlus4.3安装程序及说明.zip", "C:\\Users\\Administrator\\Desktop\\EditPlus4.3安装程序及说明.zip");
 21         long end = System.currentTimeMillis();
 22         System.out.println("运行耗时:" + (end - start) + "毫秒");
 23     }
 24 
 25     // 基本字节流一次读取一个字节复制文件
 26     public static void method1(String src, String dest) throws IOException {
 27         // 数据源
 28         FileInputStream fis = new FileInputStream(src);
 29         // 目的位置
 30         FileOutputStream fos = new FileOutputStream(dest, true);
 31         // read()方法返回值为获取到的那个字符的ASCII码值,若没有获取到,则返回-1
 32         int byt = 0;
 33         while ((byt = fis.read()) != -1) {
 34             // write(int
 35             // b)方法指的是将字节数据(主要因为read的返回值范围是0~255和-1,而write此时传参若为byte显然不合适了)写入(复制到)文件
 36             // 经测试知,传-1显示了一段空格(不是Tab建),可以传0~255和-1以外的int值,但用记事本打开是乱码(以'?'表示)
 37             fos.write(byt);
 38         }
 39         // 关闭输出流
 40         fos.close();
 41         // 关闭输入流
 42         fis.close();
 43     }
 44 
 45     // 基本字节流一次读取一个字节数组复制文件
 46     public static void method2(String src, String dest) throws IOException {
 47         // 数据源
 48         FileInputStream fis = new FileInputStream(src);
 49         // 目的位置
 50         FileOutputStream fos = new FileOutputStream(dest);
 51         // 定义单次读取字节数组的大小,一般就写1024
 52         byte[] bys = new byte[1024];
 53         // read(byte[] bys)方法返回值为获取到的字节个数,若没有获取到,则返回-1
 54         int length = 0;
 55         while ((length = fis.read(bys)) != -1) {
 56             // write(byte[] bys,int off,int length)方法指的是从指定字节数组的指定位置开始写入(复制到)文件
 57             fos.write(bys, 0, length);
 58         }
 59         // 关闭输出流
 60         fos.close();
 61         // 关闭输入流
 62         fis.close();
 63     }
 64 
 65     // 高效字节流一次读取一个字节复制文件
 66     public static void method3(String src, String dest) throws IOException {
 67         // 数据源
 68         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
 69         // 目的位置
 70         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest));
 71         // read()方法返回值为获取到的那个字符的ASCII码值,若没有获取到,则返回-1
 72         int byt = 0;
 73         while ((byt = bis.read()) != -1) {
 74             // write(int b)方法指的是将字节数据(主要因为read的返回值范围是0~255和-1,而write此时传参若为byte显然不合适了)写入(复制到)文件
 75             // 经测试知,传-1显示了一段空格(不是Tab建),可以传0~255和-1以外的int值,但用记事本打开是乱码(以'?'表示)
 76             bos.write(byt);
 77         }
 78         // 关闭输出流
 79         bos.close();
 80         // 关闭输入流
 81         bis.close();
 82     }
 83 
 84     // 高效字节流一次读取一个字节数组复制文件
 85     public static void method4(String src, String dest) throws IOException {
 86         // 数据源
 87         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
 88         // 目的位置
 89         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest));
 90         // 定义单次读取字节数组的大小,一般就写1024
 91         byte[] bys = new byte[1024];
 92         // read(byte[] bys)方法返回值为获取到的字节个数,若没有获取到,则返回-1
 93         int length = 0;
 94         while ((length = bis.read(bys)) != -1) {
 95             // write(byte[] bys,int off,int length)方法指的是从指定字节数组的指定位置开始写入(复制到)文件
 96             bos.write(bys, 0, length);
 97         }
 98         // 关闭输出流
 99         bos.close();
100         // 关闭输入流
101         bis.close();
102     }
103 }