`

Java复制文件的几种方法

    博客分类:
  • java
 
阅读更多

不考虑多线程优化,单线程文件复制最快的方法是(文件越大该方法越有优势,一般比常用方法快30+%):

 

Java代码 复制代码
  1. private static void nioTransferCopy(File source, File target) {   
  2.     FileChannel in = null;   
  3.     FileChannel out = null;   
  4.     FileInputStream inStream = null;   
  5.     FileOutputStream outStream = null;   
  6.     try {   
  7.         inStream = new FileInputStream(source);   
  8.         outStream = new FileOutputStream(target);   
  9.         in = inStream.getChannel();   
  10.         out = outStream.getChannel();   
  11.         in.transferTo(0, in.size(), out);   
  12.     } catch (IOException e) {   
  13.         e.printStackTrace();   
  14.     } finally {   
  15.         close(inStream);   
  16.         close(in);   
  17.         close(outStream);   
  18.         close(out);   
  19.     }   
  20. }  

 

如果需要监测复制进度,可以用第二快的方法(留意buffer的大小,对速度有很大影响):

C-sharp代码 复制代码
  1. private static void nioBufferCopy(File source, File target) {   
  2.     FileChannel in = null;   
  3.     FileChannel out = null;   
  4.     FileInputStream inStream = null;   
  5.     FileOutputStream outStream = null;   
  6.     try {   
  7.         inStream = new FileInputStream(source);   
  8.         outStream = new FileOutputStream(target);   
  9.         in = inStream.getChannel();   
  10.         out = outStream.getChannel();   
  11.         ByteBuffer buffer = ByteBuffer.allocate(4096);   
  12.         while (in.read(buffer) != -1) {   
  13.             buffer.flip();   
  14.             out.write(buffer);   
  15.             buffer.clear();   
  16.         }   
  17.     } catch (IOException e) {   
  18.         e.printStackTrace();   
  19.     } finally {   
  20.         close(inStream);   
  21.         close(in);   
  22.         close(outStream);   
  23.         close(out);   
  24.     }   
  25. }  

 

常用的方法1是:

C-sharp代码 复制代码
  1. private static void customBufferBufferedStreamCopy(File source, File target) {   
  2.     InputStream fis = null;   
  3.     OutputStream fos = null;   
  4.     try {   
  5.         fis = new BufferedInputStream(new FileInputStream(source));   
  6.         fos = new BufferedOutputStream(new FileOutputStream(target));   
  7.         byte[] buf = new byte[4096];   
  8.         int i;   
  9.         while ((i = fis.read(buf)) != -1) {   
  10.             fos.write(buf, 0, i);   
  11.         }   
  12.     }   
  13.     catch (Exception e) {   
  14.         e.printStackTrace();   
  15.     } finally {   
  16.         close(fis);   
  17.         close(fos);   
  18.     }   
  19. }  

 

常用的方法2是:

C-sharp代码 复制代码
  1. private static void customBufferStreamCopy(File source, File target) {   
  2.     InputStream fis = null;   
  3.     OutputStream fos = null;   
  4.     try {   
  5.         fis = new FileInputStream(source);   
  6.         fos = new FileOutputStream(target);   
  7.         byte[] buf = new byte[4096];   
  8.         int i;   
  9.         while ((i = fis.read(buf)) != -1) {   
  10.             fos.write(buf, 0, i);   
  11.         }   
  12.     }   
  13.     catch (Exception e) {   
  14.         e.printStackTrace();   
  15.     } finally {   
  16.         close(fis);   
  17.         close(fos);   
  18.     }   
  19. }  
分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

     一.JAVA程序传送到手机的方法:

     在使用微软操作系统的SmartPhone上安装软件,有三种方法:  1)直接拷贝法 与电脑类似,在智能手机上也流行"绿色软件"一说。这一类软件只须将相关文件 Copy到手机或存储卡上,然后建立一快捷方式,并将其拖入...

    java 面试题 总结

    finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 13、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)的...

    Java面试宝典2020修订版V1.0.1.doc

    1、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 56 2、sleep() 和 wait() 有什么区别? 56 3、当一个线程进入一个对象的一个synchronized方法后,其它线程...

    zero-copy-in-java-and-webflux:一个使用docker化的应用程序,示例在Java中复制文件并在Spring Webflux中使用和不使用“零复制”机制来提供文件

    零复制在Java和Webflux 此应用程序包含以下代码示例: 演示如何使用带有和不带有零复制机制的JDK API复制文件。 展示了几种在Spring WebFlux中提供静态文件并测量CPU使用率的方法。 毫不奇怪,提供零拷贝的静态文件...

    Java面试宝典-经典

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

    Java面试宝典2010版

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

    java面试题

    51.5. java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 25 52. 数据连接池 25 52.1. 连接池的基本原理: 25 52.2. 连接池的工作机制 25 52.3. 建立连接池 26 ...

    java面试题大全(2012版)

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

    java调用shell脚本执行sqlldr与存储过程

    在网上查了一遍以后有如下几种处理办法: 1、没有oracle_home目录的执行权限,无法进入到bin目录,使用chmod 755 $oracle_home更改目录权限;使用chmod 755 $oracle_home/lib更改目录权限;对目录$oracle_home/rdbms...

    java范例开发大全源代码

     实例123 复制指定目录下的文件 170  实例124 显示文件中的内容 173  实例125 将数据保存到指定的文件中 175  实例126 将由键盘中录入的信息保存到文件中 176  实例127 一个文件变成多个小文件 178 ...

    java范例开发大全

    实例123 复制指定目录下的文件 170 实例124 显示文件中的内容 173 实例125 将数据保存到指定的文件中 175 实例126 将由键盘中录入的信息保存到文件中 176 实例127 一个文件变成多个小文件 178 实例128 多个小文件...

    最新Java面试宝典pdf版

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

    Java范例开发大全 (源程序)

     实例123 复制指定目录下的文件 170  实例124 显示文件中的内容 173  实例125 将数据保存到指定的文件中 175  实例126 将由键盘中录入的信息保存到文件中 176  实例127 一个文件变成多个小文件 178  实例...

    Java面试笔试资料大全

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

    java面试宝典2012

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 32 47、sleep() 和 wait() 有什么区别? 33 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

    JAVA面试宝典2010

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

Global site tag (gtag.js) - Google Analytics