Java: 复制文件最快方法

编程之家收集整理的这篇文章主要介绍了Java: 复制文件最快方法编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

搜索热词

利用Java复制文件到处都可以用到,这里总结了一个类供大家参考。里面总共有两个方法
public static boolean copyFile(String srcFileName,String destFileName,boolean overlay);
public static boolean copyDirectory(String srcDirName,String destDirName,boolean overlay) ;
其中:
srcFileName 待复制的文件
descFileName  目标文件
overlay  如果目标文件存在,是否覆盖
如果复制成功返回true,否则返回false

代码

    1.  import java.io.File;  
    2. import java.io.FileInputStream;  
    3. import java.io.FileNotFoundException;  
    4. import java.io.FileOutputStream;  
    5. import java.io.IOException;  
    6. import java.io.InputStream;  
    7. import java.io.OutputStream;  
    8.   
    9. import javax.swing.JOptionPane;  
    10.   
    11. /** 
    12.  * 复制文件文件夹 
    13.  *  
    14.  * zww 
    15.  */  
    16. public class CopyFileUtil {  
    17.   
    18.     private static String MESSAGE = "";  
    19.   
    20.     /** 
    21.      * 复制单个文件 
    22.      *  
    23.      * @param srcFileName 
    24.      *            待复制的文件名 
    25.      * @param descFileName 
    26.      *            目标文件名 
    27.      * @param overlay 
    28.      *            如果目标文件存在,是否覆盖 
    29.      * @return 如果复制成功返回true,否则返回false 
    30.      */  
    31.     public static boolean copyFile(String srcFileName, String destFileName,  
    32.             boolean overlay) {  
    33.         File srcFile = new File(srcFileName);  
    34.   
    35.         // 判断源文件是否存在  
    36.         if (!srcFile.exists()) {  
    37.             MESSAGE = "源文件:" + srcFileName + "不存在!";  
    38.             JOptionPane.showMessageDialog(null, MESSAGE);  
    39.             return false;  
    40.         } else if (!srcFile.isFile()) {  
    41.             MESSAGE = "复制文件失败,源文件:" + srcFileName + "不是一个文件!";  
    42.             JOptionPane.showMessageDialog(null, MESSAGE);  
    43.             return false;  
    44.         }  
    45.   
    46.         // 判断目标文件是否存在  
    47.         File destFile = new File(destFileName);  
    48.         if (destFile.exists()) {  
    49.             // 如果目标文件存在并允许覆盖  
    50.             if (overlay) {  
    51.                 // 删除已经存在的目标文件,无论目标文件是目录还是单个文件  
    52.                 new File(destFileName).delete();  
    53.             }  
    54.         } else {  
    55.             // 如果目标文件所在目录不存在,则创建目录  
    56.             if (!destFile.getParentFile().exists()) {  
    57.                 // 目标文件所在目录不存在  
    58.                 if (!destFile.getParentFile().mkdirs()) {  
    59.                     // 复制文件失败:创建目标文件所在目录失败  
    60.                     return false;  
    61.                 }  
    62.             }  
    63.         }  
    64.   
    65.         // 复制文件  
    66.         int byteread = 0; // 读取的字节数  
    67.         InputStream in = null;  
    68.         OutputStream out = null;  
    69.   
    70.         try {  
    71.             in = new FileInputStream(srcFile);  
    72.             out = new FileOutputStream(destFile);  
    73.             byte[] buffer = new byte[1024];  
    74.   
    75.             while ((byteread = in.read(buffer)) != -1) {  
    76.                 out.write(buffer, 0, byteread);  
    77.             }  
    78.             return true;  
    79.         } catch (FileNotFoundException e) {  
    80.             return false;  
    81.         } catch (IOException e) {  
    82.             return false;  
    83.         } finally {  
    84.             try {  
    85.                 if (out != null)  
    86.                     out.close();  
    87.                 if (in != null)  
    88.                     in.close();  
    89.             } catch (IOException e) {  
    90.                 e.printStackTrace();  
    91.             }  
    92.         }  
    93.     }  
    94.   
    95.     /** 
    96.      * 复制整个目录的内容 
    97.      *  
    98.      * @param srcDirName 
    99.      *            待复制目录的目录名 
    100.      * @param destDirName 
    101.      *            目标目录名 
    102.      * @param overlay 
    103.      *            如果目标目录存在,是否覆盖 
    104.      * @return 如果复制成功返回true,否则返回false 
    105.      */  
    106.     public static boolean copyDirectory(String srcDirName, String destDirName,  
    107.             boolean overlay) {  
    108.         // 判断源目录是否存在  
    109.         File srcDir = new File(srcDirName);  
    110.         if (!srcDir.exists()) {  
    111.             MESSAGE = "复制目录失败:源目录" + srcDirName + "不存在!";  
    112.             JOptionPane.showMessageDialog(null, MESSAGE);  
    113.             return false;  
    114.         } else if (!srcDir.isDirectory()) {  
    115.             MESSAGE = "复制目录失败:" + srcDirName + "不是目录!";  
    116.             JOptionPane.showMessageDialog(null, MESSAGE);  
    117.             return false;  
    118.         }  
    119.   
    120.         // 如果目标目录名不是以文件分隔符结尾,则加上文件分隔符  
    121.         if (!destDirName.endsWith(File.separator)) {  
    122.             destDirName = destDirName + File.separator;  
    123.         }  
    124.         File destDir = new File(destDirName);  
    125.         // 如果目标文件夹存在  
    126.         if (destDir.exists()) {  
    127.             // 如果允许覆盖则删除已存在的目标目录  
    128.             if (overlay) {  
    129.                 new File(destDirName).delete();  
    130.             } else {  
    131.                 MESSAGE = "复制目录失败:目的目录" + destDirName + "已存在!";  
    132.                 JOptionPane.showMessageDialog(null, MESSAGE);  
    133.                 return false;  
    134.             }  
    135.         } else {  
    136.             // 创建目的目录  
    137.             System.out.println("目的目录不存在,准备创建。。。");  
    138.             if (!destDir.mkdirs()) {  
    139.                 System.out.println("复制目录失败:创建目的目录失败!");  
    140.                 return false;  
    141.             }  
    142.         }  
    143.   
    144.         boolean flag = true;  
    145.         File[] files = srcDir.listFiles();  
    146.         for (int i = 0; i < files.length; i++) {  
    147.             // 复制文件  
    148.             if (files[i].isFile()) {  
    149.                 flag = CopyFileUtil.copyFile(files[i].getAbsolutePath(),  
    150.                         destDirName + files[i].getName(), overlay);  
    151.                 if (!flag)  
    152.                     break;  
    153.             } else if (files[i].isDirectory()) {  
    154.                 flag = CopyFileUtil.copyDirectory(files[i].getAbsolutePath(), overlay);  
    155.                 if (!flag)  
    156.                     break;  
    157.             }  
    158.         }  
    159.         if (!flag) {  
    160.             MESSAGE = "复制目录" + srcDirName + "至" + destDirName + "失败!";  
    161.             JOptionPane.showMessageDialog(null, MESSAGE);  
    162.             return false;  
    163.         } else {  
    164.             return true;  
    165.         }  
    166.     }  
    167.   
    168.     public static void main(String[] args) {  
    169.         String srcDirName = "C:/test/test0/test1";  
    170.         String destDirName = "c:/ttt";  
    171.         CopyFileUtil.copyDirectory(srcDirName, destDirName, true);  
    172.     }  

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

  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的大小,对速度有很大影响):

  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是:

  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是:

  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, i);  
  11.         }  
  12.     }  
  13.     catch (Exception e) {  
  14.         e.printStackTrace();  
  15.     } finally {  
  16.         close(fis);  
  17.         close(fos);  
  18.     }  
  19. }
  20. http://www.cnblogs.com/interdrp/p/3523456.html(摘自)

总结

以上是编程之家为你收集整理的Java: 复制文件最快方法全部内容,希望文章能够帮你解决Java: 复制文件最快方法所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢寻找一群志同道合、互帮互助的学习伙伴,可以点击下方链接加入:
编程之家官方1群:1065694478(已满)
编程之家官方2群:163560250(已满)
编程之家官方3群:312128206(已满)
编程之家官方4群:230427597

相关文章

猜你在找的Java相关文章

public class SimpleDateFormat extends DateFormatSimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类。 它允许格式化 (da
利用Java复制文件到处都可以用到,这里总结了一个类供大家参考。里面总共有两个方法: public static boolean copyFile(String srcFileName, String
Statement和PreparedStatement的区别就不多废话了,直接说PreparedStatement最重要的addbatch()结构的使用.1.建立链接,(打电话拨号 ) Connect
Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。 1.Result
html5新增及废除属性 时间:2015-06-28 22:47:55 阅读:514 评论:0 收藏:0 [点我收藏+] 标签: html5中,在新增加和废除很多元素的同时,也增加和废除了很多属性。
有很多的朋友都在问我一个同样的问题:新手应该如何能学好Java.我做了一个简单的总结,分享给大家: 1-信念:无论你是选择JAVA,C,C#,C++....还是其他的语言编程,信念是第一位,只有相信自
迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。 Java中的I
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RD