MENU

Java ファイルコピー(バッファサイズを変更)

目次

Java ファイルコピー(バッファサイズを変更)

 Java で java.io.InputStreamjava.io.OutputStream での
入出力ストリームを利用したコピー処理を行うサンプルプログラムを紹介します。
ストリームを利用したコピー処理では、読み込みバファサイズを大きくすることで、大きなファイルでも比較的高速にコピーを行えます。
サンプルプログラムではデータの読み込みバッファーサイズを引数で指定可能としています。

 指定した読み込みバファ領域はJavaVMのヒープ内に確保されますので、あまり大きくしすぎても効率が悪くなります。そのため、ファイルをコピーする上で、効率の良いデータ読み込みバッファサイズについても同時に確認します。

サンプルプログラム


実行

 サンプルプログラムのファイルコピーを行うために、Cドライブ直下に 100MB のファイル「100M.txt」を用意しました。サンプルプログラムでは、 C:\100M.txt を、バッファサイズ 1000KB 単位でデータを読み込み C:\a.txt にコピーします。

尚、サンプルの実行は以下の環境で行いました。
OS : WindowsXP
CPU : Athlon 1.46GHz
メモリー : 1GB
JRE : 1.6.4

◆実行例

/**
 * 実行例
 * @param args
 */
public static void main(String[] args) {
    try {
        copyStream("C:\\100M.txt", "C:\\a.txt",1000);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

◆実行結果


バッファサイズの変更

 ファイルをコピーする上で、効率の良いデータ読み込みバッファサイズを確認するため、copyStream の第3引数に
1KB、100KB、1000KB、10000KB単位で同様のコピー処理を行った結果を以下にまとめています。



 上記の結果だけで断定することはできませんが、データ読み込みバッファサイズを 1000KB 単位に指定すると、
コピー処理中のヒープ使用量、処理時間において効率が良いと言う結果が出ました。
尚、ファイルサイズを大きくした場合( 1GB 程度)でも同様の結果が得られました。

逆にサイズが小さいファイル( 1MB 以下ぐらい )をコピーする場合は、バッファサイズを大きくしても無駄になりますので 100KB ぐらいで指定するのが良いかと思います。

FileChannelを利用してもっと高速に


 java.io.InputStreamjava.io.OutputStream
でのコピー処理は入出力ストリームを理解する上で、重要ではありますが、
J2SE1.4 で導入された New I/O の java.nio.channels.FileChannel#transferTo
メソッドを利用することで、さらに効率良くファイルコピーを行うことができます。
次は、FileChannel を利用して簡単・高速にファイルコピーを行う方法を紹介します。
Java ファイルコピー(簡単・高速)

  • URLをコピーしました!
目次