zoukankan      html  css  js  c++  java
  • java中文件复制的4种方式

          今天一个同事问我文件复制的问题,他一个100M的文件复制的指定目录下竟然成了1G多,吓我一跳,后来看了他的代码发现是自己通过字节流复制的,定义的字节数组很大,导致复制后目标文件非常大,其实就是空行等一些无效空间。我也是很少用这种方式拷贝问价,大多数用Apache提供的commons-io中的FileUtils,后来在网上查了下,发现还有其他的方式,效率更高,所以在此整理一下,也是自己的一个学习。

    1. 使用FileStreams复制

    比较经典的一个代码,使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B。

    public static void copy(String source, String dest, int bufferSize) {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(new File(source));
            out = new FileOutputStream(new File(dest));
    
            byte[] buffer = new byte[bufferSize];
            int len;
    
            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
        } catch (Exception e) {
            Log.w(TAG + ":copy", "error occur while copy", e);
        } finally {
            safelyClose(TAG + ":copy", in);
            safelyClose(TAG + ":copy", out);
        }
    }   
    2.

    2、使用FileChannel

    Java NIO包括transferFrom方法,根据文档应该比文件流复制的速度更快。

    public static void copyNio(String source, String dest) {
        FileChannel input = null;
        FileChannel output = null;
    
        try {
            input = new FileInputStream(new File(from)).getChannel();
            output = new FileOutputStream(new File(to)).getChannel();
            output.transferFrom(input, 0, input.size());
        } catch (Exception e) {
            Log.w(TAG + "copyNio", "error occur while copy", e);
        } finally {
            safelyClose(TAG + "copyNio", input);
            safelyClose(TAG + "copyNio", output);
        }
    }

    3、 使用Apache Commons IO复制
    Appache Commons IO 提供了一个FileUtils.copyFile(File from, File to)方法用于文件复制,如果项目里使用到了这个类库,使用这个方法是个不错的选择。
    它的内部也是使用Java NIO的FileChannel实现的。
    commons-io的路径:http://commons.apache.org/proper/commons-io/javadocs/api-release/index.html。里面还有很多实用的方法,如拷贝目录、拷贝指定格式文件等。
    private static void  copyFileByApacheCommonsIO(File source, File dest) throws IOException {
        FileUtils.copyFile(source, dest);
    }
    4、使用Java7的Files类复制
    private static void copyFileUsingJava7Files(File source, File dest) throws IOException {
        Files.copy(source.toPath(), dest.toPath());
    }
    我没有亲测,找了下网友的测试程序和输出,性能数据供大家参考(来源:https://www.jb51.net/article/70412.htm)
    import java.io.File;
    
    
    import java.io.FileInputStream;
    
    
    import java.io.FileOutputStream;
    
    
    import java.io.IOException;
    
    
    import java.io.InputStream;
    
    
    import java.io.OutputStream;
    
    
    import java.nio.channels.FileChannel;
    
    
    import java.nio.file.Files;
    
    
    import org.apache.commons.io.FileUtils;
    
    
    public class CopyFilesExample {
      public static void main(String[] args) throws InterruptedException,
    
    
          IOException {
    
    
        File source = new File("C:\Users\nikos7\Desktop\files\sourcefile1.txt");
    
    
        File dest = new File("C:\Users\nikos7\Desktop\files\destfile1.txt");
    
    
      
    
    
        // copy file using FileStreams
    
    
        long start = System.nanoTime();
    
    
        long end;
    
    
        copyFileUsingFileStreams(source, dest);
    
    
        System.out.println("Time taken by FileStreams Copy = "
    
    
            + (System.nanoTime() - start));
     
        // copy files using java.nio.FileChannel
    
    
        source = new File("C:\Users\nikos7\Desktop\files\sourcefile2.txt");
    
    
        dest = new File("C:\Users\nikos7\Desktop\files\destfile2.txt");
    
    
        start = System.nanoTime();
    
    
        copyFileUsingFileChannels(source, dest);
    
    
        end = System.nanoTime();
    
    
        System.out.println("Time taken by FileChannels Copy = " + (end - start));
        // copy file using Java 7 Files class
    
    
        source = new File("C:\Users\nikos7\Desktop\files\sourcefile3.txt");
    
    
        dest = new File("C:\Users\nikos7\Desktop\files\destfile3.txt");
    
    
        start = System.nanoTime();
    
    
        copyFileUsingJava7Files(source, dest);
    
    
        end = System.nanoTime();
    
    
        System.out.println("Time taken by Java7 Files Copy = " + (end - start));
    
    
        // copy files using apache commons io
    
    
        source = new File("C:\Users\nikos7\Desktop\files\sourcefile4.txt");
    
    
        dest = new File("C:\Users\nikos7\Desktop\files\destfile4.txt");
    
    
        start = System.nanoTime();
    
    
        copyFileUsingApacheCommonsIO(source, dest);
    
    
        end = System.nanoTime();
    
    
        System.out.println("Time taken by Apache Commons IO Copy = "
    
    
            + (end - start));
      }
    
    
      private static void copyFileUsingFileStreams(File source, File dest)
    
    
          throws IOException {
    
    
        InputStream input = null;
    
    
        OutputStream output = null;
    
    
        try {
    
    
          input = new FileInputStream(source);
    
    
          output = new FileOutputStream(dest);
    
    
          byte[] buf = new byte[1024];
    
    
          int bytesRead;
    
    
          while ((bytesRead = input.read(buf)) > 0) {
    
    
            output.write(buf, 0, bytesRead);
    
    
          }
    
    
        } finally {
    
    
          input.close();
    
    
          output.close();
    
    
        }
    
    
      }
    
    
      private static void copyFileUsingFileChannels(File source, File dest)
    
    
          throws IOException {
    
    
        FileChannel inputChannel = null;
    
    
        FileChannel outputChannel = null;
    
    
        try {
    
    
          inputChannel = new FileInputStream(source).getChannel();
    
    
          outputChannel = new FileOutputStream(dest).getChannel();
    
    
          outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
    
    
        } finally {
    
    
          inputChannel.close();
    
    
          outputChannel.close();
    
    
        }
    
    
      }
    
    
      private static void copyFileUsingJava7Files(File source, File dest)
    
    
          throws IOException {
    
    
        Files.copy(source.toPath(), dest.toPath());
    
    
      }
    
    
      private static void copyFileUsingApacheCommonsIO(File source, File dest)
    
    
          throws IOException {
    
    
        FileUtils.copyFile(source, dest);
    
    
      }
    }
    
    

    输出:

    Time taken by FileStreams Copy = 127572360
    
    
    Time taken by FileChannels Copy = 10449963
    
    
    Time taken by Java7 Files Copy = 10808333
    
    
    Time taken by Apache Commons IO Copy = 17971677
     
  • 相关阅读:
    MapXtreme 2005
    QQ在线源码
    Oralce rowid
    MOSS2007 安装与部署(下)
    MapXtreme 2005新增内容
    MOSS 2007安装与部署(上)
    PL/SQL中的where子句比较
    Oracle中插入日期型数据
    在HTML语言网页中加载视频的代码
    HTTP 错误 500.24 Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置。
  • 原文地址:https://www.cnblogs.com/xxjcai/p/11581987.html
Copyright © 2011-2022 走看看