Java 文件复制

简介: 摘要尽管Java提供了一个可以处理文件的IO操作类。 但是没有一个复制文件的方法。 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候。 然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式。

摘要

尽管Java提供了一个可以处理文件的IO操作类。 但是没有一个复制文件的方法。 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候。 然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式。
 
1.使用File Streams复制

这是最经典的方式将一个文件的内容复制到另一个文件中。 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B。 这是第一个方法的代码:

public 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();
}

}

正如你所看到的我们执行几个读和写操作try的数据,所以这应该是一个低效率的,下一个方法我们将看到新的方式。

2. 使用FileChannel复制

Java NIO包括transferFrom方法,根据文档应该比文件流复制的速度更快。 这是第二种方法的代码:

  1.  
    private static void copyFileUsingFileChannels(File source, File dest) throws IOException {    
  2.  
            FileChannel inputChannel =  null;    
  3.  
            FileChannel outputChannel =  null;    
  4.  
         try {
  5.  
            inputChannel =  new FileInputStream(source).getChannel();
  6.  
            outputChannel =  new FileOutputStream(dest).getChannel();
  7.  
            outputChannel.transferFrom(inputChannel,  0, inputChannel.size());
  8.  
        }  finally {
  9.  
            inputChannel.close();
  10.  
            outputChannel.close();
  11.  
        }
  12.  
    }

3. 使用Commons IO复制

Apache Commons IO提供拷贝文件方法在其FileUtils类,可用于复制一个文件到另一个地方。它非常方便使用Apache Commons FileUtils类时,您已经使用您的项目。基本上,这个类使用Java NIO FileChannel内部。 这是第三种方法的代码:

  1.  
    private static void copyFileUsingApacheCommonsIO(File source, File dest)
  2.  
             throws IOException {
  3.  
        FileUtils.copyFile(source, dest);
  4.  
    }

4. 使用Java7的Files类复制

如果你有一些经验在Java 7中你可能会知道,可以使用复制方法的Files类文件,从一个文件复制到另一个文件。 这是第四个方法的代码:

  1.  
    private static void copyFileUsingJava7Files(File source, File dest)
  2.  
             throws IOException {    
  3.  
            Files.copy(source.toPath(), dest.toPath());
  4.  
    }

5. 测试

现在看到这些方法中的哪一个是更高效的,我们会复制一个大文件使用每一个在一个简单的程序。 从缓存来避免任何性能明显我们将使用四个不同的源文件和四种不同的目标文件。 让我们看一下代码:

  1.  
    import java.io.File;
  2.  
    import java.io.FileInputStream;
  3.  
    import java.io.FileOutputStream;
  4.  
    import java.io.IOException;
  5.  
    import java.io.InputStream;
  6.  
    import java.io.OutputStream;
  7.  
    import java.nio.channels.FileChannel;
  8.  
    import java.nio.file.Files;
  9.  
    import org.apache.commons.io.FileUtils;
  10.  
     
  11.  
    public class CopyFilesExample {
  12.  
     
  13.  
    public static void main(String[] args) throws InterruptedException,
  14.  
    IOException {
  15.  
     
  16.  
    File source =  new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile1.txt");
  17.  
    File dest =  new File("C:\\Users\\nikos7\\Desktop\\files\\destfile1.txt");
  18.  
     
  19.  
    // copy file using FileStreamslong start = System.nanoTime();
  20.  
    long end;
  21.  
    copyFileUsingFileStreams(source, dest);
  22.  
    System.out.println( "Time taken by FileStreams Copy = "
  23.  
    + (System.nanoTime() - start));
  24.  
     
  25.  
    // copy files using java.nio.FileChannelsource = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile2.txt");
  26.  
    dest =  new File("C:\\Users\\nikos7\\Desktop\\files\\destfile2.txt");
  27.  
    start = System.nanoTime();
  28.  
    copyFileUsingFileChannels(source, dest);
  29.  
    end = System.nanoTime();
  30.  
    System.out.println( "Time taken by FileChannels Copy = " + (end - start));
  31.  
     
  32.  
    // copy file using Java 7 Files classsource = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile3.txt");
  33.  
    dest =  new File("C:\\Users\\nikos7\\Desktop\\files\\destfile3.txt");
  34.  
    start = System.nanoTime();
  35.  
    copyFileUsingJava7Files(source, dest);
  36.  
    end = System.nanoTime();
  37.  
    System.out.println( "Time taken by Java7 Files Copy = " + (end - start));
  38.  
     
  39.  
    // copy files using apache commons iosource = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile4.txt");
  40.  
    dest =  new File("C:\\Users\\nikos7\\Desktop\\files\\destfile4.txt");
  41.  
    start = System.nanoTime();
  42.  
    copyFileUsingApacheCommonsIO(source, dest);
  43.  
    end = System.nanoTime();
  44.  
    System.out.println( "Time taken by Apache Commons IO Copy = "
  45.  
    + (end - start));
  46.  
     
  47.  
    }
  48.  
     
  49.  
    private static void copyFileUsingFileStreams(File source, File dest)
  50.  
    throws IOException {
  51.  
    InputStream input =  null;
  52.  
    OutputStream output =  null;
  53.  
    try {
  54.  
    input =  new FileInputStream(source);
  55.  
    output =  new FileOutputStream(dest);
  56.  
    byte[] buf = new byte[1024];
  57.  
    int bytesRead;
  58.  
    while ((bytesRead = input.read(buf)) > 0) {
  59.  
    output.write(buf,  0, bytesRead);
  60.  
    }
  61.  
    finally {
  62.  
    input.close();
  63.  
    output.close();
  64.  
    }
  65.  
    }
  66.  
     
  67.  
    private static void copyFileUsingFileChannels(File source, File dest)
  68.  
    throws IOException {
  69.  
    FileChannel inputChannel =  null;
  70.  
    FileChannel outputChannel =  null;
  71.  
    try {
  72.  
    inputChannel =  new FileInputStream(source).getChannel();
  73.  
    outputChannel =  new FileOutputStream(dest).getChannel();
  74.  
    outputChannel.transferFrom(inputChannel,  0, inputChannel.size());
  75.  
    finally {
  76.  
    inputChannel.close();
  77.  
    outputChannel.close();
  78.  
    }
  79.  
    }
  80.  
     
  81.  
    private static void copyFileUsingJava7Files(File source, File dest)
  82.  
    throws IOException {
  83.  
    Files.copy(source.toPath(), dest.toPath());
  84.  
    }
  85.  
     
  86.  
    private static void copyFileUsingApacheCommonsIO(File source, File dest)
  87.  
    throws IOException {
  88.  
    FileUtils.copyFile(source, dest);
  89.  
    }
  90.  
     
  91.  
    }

输出:

  1.  
    Time taken by FileStreams Copy = 127572360
  2.  
    Time taken by FileChannels Copy = 10449963
  3.  
    Time taken by Java7 Files Copy = 10808333
  4.  
    Time taken by Apache Commons IO Copy = 17971677

正如您可以看到的FileChannels拷贝大文件是最好的方法。如果你处理更大的文件,你会注意到一个更大的速度差。 这是一个示例,该示例演示了Java中四种不同的方法可以复制一个文件。

 

 
目录
相关文章
|
27天前
|
Java Apache 开发工具
【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存
【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存
|
16天前
|
Arthas Java 测试技术
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
Java字节码文件、组成、详解、分析;常用工具,jclasslib插件、阿里arthas工具;如何定位线上问题;Java注解
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
|
20小时前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
15天前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
1月前
|
Java
Java系列之 重命名文件/图片,renameTo() 方法的使用
这篇文章介绍了Java中File类的renameTo()方法,包括其使用方式、参数、返回值以及一些使用时的注意事项,并通过示例代码演示了如何使用该方法来重命名文件。
Java系列之 重命名文件/图片,renameTo() 方法的使用
|
13天前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!
|
14天前
|
算法 Java
Java 压缩文件
在Java中压缩文件是一个常见的需求,通常可以通过使用Java自带的`java.util.zip`包来实现。这个包提供了`ZipOutputStream`类来创建ZIP格式的压缩文件。以下是一个简单的示例,展示了如何将多个文件压缩到一个ZIP文件中。 ### 示例:将多个文件压缩到一个ZIP文件中 ```java import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipFilesExample { public static vo
|
1月前
|
Java
java网络编程 UDP通信协议实现局域网内文件的发送和接收
java网络编程 UDP通信协议实现局域网内文件的发送和接收
java网络编程 UDP通信协议实现局域网内文件的发送和接收
|
26天前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
|
26天前
|
Java 程序员
Java系统中的错误码设计问题之实现一个基于properties文件的错误消息管理系统如何解决
Java系统中的错误码设计问题之实现一个基于properties文件的错误消息管理系统如何解决
13 1