Javaレプリケーションファイルの4つの方法


JAvaレプリケーションファイルの4つの方法の要約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(); } }
  • 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); }
  • Java 7のFilesクラスを使用して
  • をコピー
    Java 7でいくつかの経験がある場合は、コピーメソッドのFilesクラスファイルを使用して、1つのファイルから別のファイルにコピーすることができます.これは4番目のメソッドのコードです.
    private static void copyFileUsingJava7Files(File source, File dest) throws IOException { Files.copy(source.toPath(), dest.toPath()); }
  • テスト
  • これらの方法のどちらがより効率的なのかを見ると、大きなファイルをコピーして簡単なプログラムを使用します.キャッシュからパフォーマンスを回避するには、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 FileStreamslong start = System.nanoTime(); long end; copyFileUsingFileStreams(source, dest); System.out.println("Time taken by FileStreams Copy = " + (System.nanoTime() - start)); // copy files using java.nio.FileChannelsource = 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 classsource = 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 iosource = 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つの異なる方法で1つのファイルをコピーできる例です.