4種類のjavaがファイルをコピーする方法

6763 ワード

Javaはファイルを処理できるIO操作クラスを提供しているが、ファイルをコピーする方法はない.ファイルのコピーは重要な操作であり、プログラムが多くのファイル関連を処理しなければならない場合です.しかし、Javaファイルのコピー操作を行うにはいくつかの方法があります.以下に、4で最も人気のある方法を挙げます.
1.FileStreamsによるレプリケーション
これは、1つのファイルの内容を別のファイルにコピーする最も古典的な方法です.FileInputStreamを使用してファイルAのバイトを読み込み、FileOutputStreamを使用してファイルBに書き込みます.これは最初のメソッドのコードです.

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

ご覧のようにtryのデータの読み取りと書き込みをいくつか実行しているので、これは低効率であるべきで、次の方法では新しい方法を見ることができます.
2.FileChannelによるレプリケーション
Java NIOにはtransferFromメソッドが含まれており、ドキュメントに基づいてファイルストリームよりもレプリケーションの速度が速いはずです.これは2つ目の方法のコードです.

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



3.Commons IOでコピー
Apache Commons IOは、ファイルを別の場所にコピーするために使用できるFileUtilsクラスでファイルをコピーする方法を提供します.Apache Commons FileUtilsクラスを使用すると、すでにプロジェクトを使用しています.基本的に、このクラスはJava NIO FileChannel内部を使用します.これは3つ目の方法のコードです.

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

4.Java 7のFilesクラスレプリケーションを使用する
Java 7で経験がある場合は、コピー方法のFilesクラスファイルを使用して、あるファイルから別のファイルにコピーすることができます.これは4番目の方法のコードです.

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



5.テスト
これらの方法のどちらがより効率的かを見ると、簡単なプログラムで大きなファイルをコピーして使用します.キャッシュからパフォーマンスを回避するには、4つの異なるソースファイルと4つの異なるターゲットファイルを使用します.コードを見てみましょう.

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\
ikos7\\Desktop\\files\\sourcefile1.txt"); File dest = new File("C:\\Users\
ikos7\\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\
ikos7\\Desktop\\files\\sourcefile2.txt"); dest = new File("C:\\Users\
ikos7\\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\
ikos7\\Desktop\\files\\sourcefile3.txt"); dest = new File("C:\\Users\
ikos7\\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\
ikos7\\Desktop\\files\\sourcefile4.txt"); dest = new File("C:\\Users\
ikos7\\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



ご覧のようにFileChannelsが大きなファイルをコピーするのが最善の方法です.より大きなファイルを処理すると、より大きな速度の差に気づきます.これは、Javaで4つの異なる方法でファイルをコピーできる例です.
以上が本文のすべての内容で、みんなの学習に役立つことを望みます.