Java 文件复制

摘要

尽管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中四种不同的方法可以复制一个文件。

原文地址:https://www.cnblogs.com/Firesun/p/9424511.html

时间: 2024-10-11 18:11:58

Java 文件复制的相关文章

Java文件复制

主要是工作代码,无解释. /** * 将文件或文件夹source复制到dest * <br>目标文件检测: * <br> a.当文件不存在时:需要创建文件 * <br> 根据是否有后缀名来确定是创建的是文件夹还是文件,有后缀名时创建文件 * <br> 如果创建的是文件夹则会将source复制到dest文件夹中. * <br> 如果是文件,则直接将source复制为dest * <br> b.当文件存在时:需要判断目标文件是文件夹还是文

Java File IO 练习题:把一个文件夹下的.java文件复制到另一个文件夹下的.txt文件

package com.swift; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.In

编写一个程序,将 d: \ java 目录下的所有.java 文件复制到d: \ jad 目录下,并 将原来文件的扩展名从.java 改为.jad

1.编写一个程序,将 d: \ java 目录下的所有.java 文件复制到d: \ jad 目录下,并 将原来文件的扩展名从.java 改为.jad package copy; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; i

java文件复制函数

在写代码中,经常会需要复制文件.这时候就可以把这些函数放到工具类里面. 下面是一个复制文件的函数: public class CopyFileUtil { private static String MESSAGE = ""; /** * 复制单个文件 * * @param srcFileName * 待复制的文件名 * @param descFileName * 目标文件名 * @param overlay * 如果目标文件存在,是否覆盖 * @return 如果复制成功返回true

编写一个程序,将 d:\java 目录下的所有.java 文件复制到 d:\jad 目录下,并 将原来文件的扩展名从.java 改为.jad。

package IO; import java.io.*; public class FileCopy { public static void main(String[] args) throws Exception { File srcDir = new File("java"); if(!(srcDir.isDirectory() && srcDir.exists())) { throw new Exception("目录不存在"); } //

将某一个路径下的所有java文件复制到另外一个文件夹下,并重命名为jad文件

需求很简单,程序也不难.看到题目之后,自己第一次没有使用eclipse,而是使用了编辑器,手编了一个程序,简陋,但实现了功能. 代码如下: import java.io.*; class Copy{ public void copy(String srcPath, String targetPath) throws Exception{ File srcFolder = new File(srcPath); File tarFolder = new File(targetPath); if(!t

java使用字节流和字符流实现文件复制

大家在Java开发中都会遇到文件复制的文件,众所周知,需要通过文件输入输出流实现. 那究竟该怎么做那,话不多说,直接上代码: 一,使用字节流复制文件 public class FileByteCopy {public static void main(String[] args) { FileByteCopy f= new FileByteCopy(); try { f.copy("d:/File/1.txt","d:/CopyFile/1.txt"); } cat

java文件和文件夹的增删复制

在使用java进行开发时经常会用到文件和文件夹的增删复制等方法,我写了一个小工具类,和大家分享,希望大家指正: package com.wangpeng.utill; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.InputStream; import java.io.PrintWrite

java用流实现创建文件夹, 文件改名, 文件删除, 文件复制

创建TestFileManager类,在本类中分别创建factFile()方法(遍历文件夹中所有的文件).console()方法(换行).createFolder()方法(创建文件夹). renameFile()方法(改名).deleteFile()方法(删除文件).copyFile()方法(复制文件).showContent()(每一次操作完成重新输出所有文件): package com.maya.hanqi.filemanager; import java.io.BufferedReader