Javaサンプルコード辞典

FileChannel,ByteBuffer - ファイルマッピングでファイルをコピーする

「FileChannel」と「ByteBuffer」を使用してファイルをメモリにマップし、ファイルをコピーするサンプルコードです。

java.nioパッケージの「FileChannel」と「ByteBuffer」を使用してファイルをコピーします。メモリマッピングはダイレクトバッファを使用するため、高速にデータにアクセスできますが、マッピング処理自体は負荷が高い処理ですので、小さなサイズのデータを扱うの場合は、パフォーマンスに対する効果がありません。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

//コマンドラインの第1引数で指定されたファイルを第2引数で指定されたファイルにコピーする
//第1引数(例:c:\\dev\\test.txt) 第2引数(例:c:\\dev\\test_copy.txt)
public class MapFileCopy {

      public static void main(String[] args) {
            
            System.out.println("--処理開始--");
            
            //コマンドライン引数が入力されているかチェックを行う
            if(args.length < 2)
            {
                  System.out.println("コマンドライン引数を指定してください");
                  return;
            }
            

            //ファイル入力用チャネル
            FileChannel inChannel = null;
            
            //ファイル出力用チャネル
            FileChannel outChannel = null;
            
            try
            {
                  //一度にメモリにマップするサイズの最大値(1MB)
                  int MAP_SIZE = 1048576;
                  
                  //ファイル入力用ストリームからチャネルを取得する
                  FileInputStream in = new FileInputStream(args[0]);
                  inChannel = in.getChannel();
                  
                  //ファイル出力用ストリームからチャネルを取得する
                  FileOutputStream out = new FileOutputStream(args[1]);
                  outChannel = out.getChannel();
                  
                  //入力ファイルのサイズを取得する
                  long fileSize = inChannel.size();
                  
                  //ファイル中の現在位置
                  int position = 0;
                  
                  //現在位置がファイルサイズを超えたらループを抜ける
                  while( position < fileSize)
                  {
                        //一度にメモリにマップするサイズ
                        int length = 0;
                        
                        //次回のマップを行ってもファイルの終端に達しない場合
                        if(position + MAP_SIZE < fileSize)
                        {
                              length = MAP_SIZE;
                        }
                        //次回のマップでファイルの終端に達する場合
                        else
                        {
                              length = (int)(fileSize - position);
                        }
                        //読み取り専用モードでファイルの内容をメモリにマップする
                        //第2引数は、MAPを開始する位置、第3引数はMAPする容量
                        ByteBuffer buff
                               = inChannel.map(FileChannel.MapMode.READ_ONLY, position, length);
                        
                        //バッファの内容をファイルに出力する
                        outChannel.write(buff);
                        
                        //MAPしたサイズ分現在位置を進める
                        position += length;

                  }

            }
            catch(IOException e)
            {
                  System.out.println(e);
            }
            finally
            {
                  if(inChannel != null)
                  {
                        try
                        {
                              inChannel.close();
                        }catch(Exception e){ System.out.println(e); }
                  }
                  
                  if(outChannel != null)
                  {
                        try
                        {
                              outChannel.close();
                        }catch(Exception e){ System.out.println(e); }
                  }
            }
            
            System.out.println("--処理終了--");
      }

}

(2007年12月18日)  

 ちょっと一休み. Javaキーワード並び替えゲーム

画面に表示される文字列を並び替えるとJavaに関連するキーワードになります。ヒントをたよりに並び替えを行ってエンターを押してください。 ユーザ登録をしてログインするとランキングに参加できます。
Flex Tips

DWRでリッチなWebページを作る!

Java Tips  java.io 編

Java Tips  java.lang 編