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

27010 ワード

JAvaレプリケーションファイルの4つの方法
サマリ
Javaはファイルを処理できるIO操作クラスを提供していますが.しかし、ファイルをコピーする方法はありません.ファイルのコピーは重要な操作であり、プログラムが多くのファイル関連を処理しなければならない場合です.しかし、Javaファイルのコピー操作を行うにはいくつかの方法があります.以下に、4で最も人気のある方法を挙げます.
  • 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のデータの読み取りと書き込みをいくつか実行しているので、これは低効率であるべきで、次の方法では新しい方法を見ることができます.
  • 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クラスファイルを使用して、あるファイルから別のファイルにレプリケーションすることができます.これは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=104449963 Time taken by Java 7 Files Copy=10808333 Time taken by Apache Commons IO Copy=17971677ご覧のようにFileChannelsが大きなファイルをコピーするのが最善の方法です.より大きなファイルを処理すると、より大きな速度の差に気づきます.これは、Javaで4つの異なる方法でファイルをコピーできる例です.