文件复制 4种方法用时比较

  1 public class FileUtils {
  2     /**
  3      * 遍历目录  遍历出目录下的文件名和子目录名
  4      *
  5      * @param dir 目录
  6      * @throws IllegalAccessException
  7      */
  8     public static void listDirectory(File dir) throws IllegalAccessException {
  9         if (!dir.exists()) {
 10             throw new IllegalAccessException("目录:" + dir + "不存在");
 11         }
 12         if (!dir.isDirectory()) {
 13             throw new IllegalAccessException(dir + "不是目录");
 14         }
 15         String[] fileNames = dir.list();
 16         for (String s : fileNames) {
 17             System.out.println(dir + "//" + s);
 18         }
 19     }
 20 
 21     /**
 22      * 一个字节一个字节的复制文件
 23      *
 24      * @param srcFile
 25      * @param destFile
 26      * @throws IllegalAccessException
 27      * @throws IOException
 28      */
 29     public static void copyFileByByte(File srcFile, File destFile) throws IllegalAccessException, IOException {
 30         if (!srcFile.exists()) {
 31             throw new IllegalAccessException("文件:" + srcFile + "不存在");
 32         }
 33         if (!srcFile.isFile()) {
 34             throw new IllegalAccessException(srcFile + "不是文件");
 35         }
 36         FileInputStream in = new FileInputStream(srcFile);
 37         FileOutputStream out = new FileOutputStream(destFile);
 38         int b;
 39         while ((b = in.read()) != -1) {
 40             out.write(b);
 41             out.flush();
 42         }
 43         in.close();
 44         out.close();
 45     }
 46 
 47     /**
 48      * 批量复制文件
 49      *
 50      * @param srcFile  源文件对象
 51      * @param destFile 复制到的文件对象
 52      * @throws IllegalAccessException
 53      * @throws FileNotFoundException
 54      */
 55     public static void copyFile(File srcFile, File destFile) throws IllegalAccessException, IOException {
 56         if (!srcFile.exists()) {
 57             throw new IllegalAccessException("文件:" + srcFile + "不存在");
 58         }
 59         if (!srcFile.isFile()) {
 60             throw new IllegalAccessException(srcFile + "不是文件");
 61         }
 62         FileInputStream in = new FileInputStream(srcFile);
 63         FileOutputStream out = new FileOutputStream(destFile);
 64         byte[] buf = new byte[8 * 1024];
 65         int b;
 66         while ((b = in.read(buf, 0, buf.length)) != -1) {
 67             out.write(buf, 0, b);
 68             out.flush();
 69         }
 70         in.close();
 71         out.close();
 72     }
 73 
 74     /**
 75      * 复制文件 利用缓冲区
 76      *
 77      * @param srcFile
 78      * @param destFile
 79      * @throws IllegalAccessException
 80      * @throws IOException
 81      */
 82     public static void copyFileByBuffer(File srcFile, File destFile) throws IllegalAccessException, IOException {
 83         if (!srcFile.exists()) {
 84             throw new IllegalAccessException("文件:" + srcFile + "不存在");
 85         }
 86         if (!srcFile.isFile()) {
 87             throw new IllegalAccessException(srcFile + "不是文件");
 88         }
 89         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
 90         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
 91         int c = 0;
 92         while ((c = bis.read()) != -1) {
 93             bos.write(c);
 94             //刷新缓存区
 95             bos.flush();
 96         }
 97         bis.close();
 98         bos.close();
 99     }
100 
101     /**
102      * 批量缓存复制文件
103      *
104      * @param srcFile
105      * @param destFile
106      * @throws IllegalAccessException
107      * @throws IOException
108      */
109     public static void copyFileBatchBuffer(File srcFile, File destFile) throws IllegalAccessException, IOException {
110         if (!srcFile.exists()) {
111             throw new IllegalAccessException("文件:" + srcFile + "不存在");
112         }
113         if (!srcFile.isFile()) {
114             throw new IllegalAccessException(srcFile + "不是文件");
115         }
116         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
117         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
118         byte[] buf = new byte[8 * 1024];
119         int b;
120         while ((b = bis.read(buf, 0, buf.length)) != -1) {
121             bos.write(buf, 0, b);
122             bos.flush();
123         }
124         bis.close();
125         bos.close();
126     }
127 
128     /**
129      * 复制 1.76M MP4文件用时比较
130      *
131      * @param args
132      * @throws IllegalAccessException
133      * @throws IOException
134      */
135     public static void main(String[] args) throws IllegalAccessException, IOException {
136         long startTime = System.currentTimeMillis();
137         //单字节复制用时:6596ms
138         copyFileByByte(new File("D:\文件\QQ视频20180718111001.mp4"), new File("D:\文件\1.mp4"));
139         //批量复制:6ms
140         copyFile(new File("D:\文件\QQ视频20180718111001.mp4"), new File("D:\文件\2.mp4"));
141         //单字节缓存复制用时:2709ms
142         copyFileByBuffer(new File("D:\文件\QQ视频20180718111001.mp4"), new File("D:\文件\3.mp4"));
143         //批量缓存复制用时:5ms
144         copyFileBatchBuffer(new File("D:\文件\QQ视频20180718111001.mp4"), new File("D:\文件\4.mp4"));
145         long endTime = System.currentTimeMillis();
146         System.out.println(endTime - startTime);
147     }
148 }
原文地址:https://www.cnblogs.com/mmmmm/p/9617790.html