Java NIO教程(七)FileChanel

3760 ワード

参考:http://ifeve.com/file-channel/ 原文の住所
目次
  • Java NIO教程
  • Java NIO教程(一)概要
  • Java NIO教程(二)Chanel
  • Java NIO教程(三)Buffer
  • Java NIO教程(四)Scater/Gather
  • Java NIO教程(五)チャネル間のデータ伝送
  • Java NIO教程(六)Selector
  • Java NIO教程(七)FileChanel
  • Java NIO教程(八)SocketChanel
  • Java NIO教程(9)ServerSocketChanel
  • Java NIO教程(10)非ブロッキングサーバ
  • Java NIO教程(十一)Java NIO DatagramChanel
  • Java NIO教程(12)Pipe
  • Java NIO教程(13)Java NIO vs.IO
  • Java NIO教程(14)Java NIO Path
  • Java NIO教程(15)Java NIO Files
  • Java NIO教程(十六)Java NIO Aynch rousFileChanel
  • Java NIOのFileChannelは、ファイルに接続されたチャネルである。ファイルチャンネルを通してファイルを読み書きできます。FileChannelは、ブロックモードでは常に動作している非ブロッキングモードに設定できません。
    FileChanelを開くFileChannelを使用する前に、まず開けなければなりません。しかし、FileChannelInputStreamOutputStream、またはRandomAccessFileを使用して、一つのFileChannelの例を取得する必要があります。RandomAccessFileを介してFileChannelを開く例である。
    RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
    FileChannel inChannel = aFile.getChannel();
    
    FileChanelからデータを読み出す
    複数のread()方法のうちの一つを呼び出して、FileChannelからデータを読み出す。例えば:
    ByteBuffer buf = ByteBuffer.allocate(48);
    int bytesRead = inChannel.read(buf);
    
    まず、Bufferを割り当てます。FileChannelから読み出されたデータはBufferに読み出される。
    その後、FileChannel.read()方法を呼び出す。この方法は、FileChannelからBufferにデータを読み出す。read()方法で返されたint値は、Bufferに読まれたバイト数を示している。-1に戻ると、ファイルの末尾に表示されます。
    FileChanelにデータを書きます。FileChannel.write()方法を用いてFileChannelにデータを書き込み、この方法のパラメータはBufferである。例えば:
    String newData = "New String to write to file..." + System.currentTimeMillis();
    
    ByteBuffer buf = ByteBuffer.allocate(48);
    buf.clear();
    buf.put(newData.getBytes());
    
    buf.flip();
    
    while(buf.hasRemaining()) {
        channel.write(buf);
    }
    
    注意FileChannel.write()は、whileサイクルで起動される。write()方法が一度に何バイトをFileChannelに書き込むことができるかは保証できないので、write()にチャネルに未記入のバイトがないまで、Bufferを呼び出す方法を繰り返す必要がある。
    FileChanelを閉じるFileChannelを使い切ったら必ず閉めます。例えば:
    channel.close();
    
    FileChanelのposition方法FileChannelのある特定の位置でデータの読み書き動作を行う必要がある場合がある。position()を呼び出してFileChannelの現在位置を取得することができる。position(long pos)を呼び出してFileChannelの現在位置を設定しても良い。
    ここには二つの例があります。
    long pos = channel.position();
    channel.position(pos +123);
    
    ファイルの終了符の後に位置を設定し、ファイルのチャンネルからデータを読み込もうとすると、読み出し方法は-1のファイル終了フラグに戻ります。
    ファイルの終了符の後に位置を設定し、チャンネルにデータを書き込むと、ファイルが現在位置まで大きくなり、データを書き込みます。これは「ファイルの空き」を引き起こし、ディスク上の物理ファイルに書き込まれたデータの間に空きがあります。
    FileChanelのsize方法FileChannel例のsize()方法は、インスタンスに関連するファイルのサイズを返す。例えば:
    long fileSize = channel.size();
    
    FileChanelのtruncate方法FileChannel.truncate()方法を使用して、一つのファイルを切り取ることができる。ファイルを切り取るときは、ファイルで指定された長さの後ろの部分が削除されます。例えば:
    channel.truncate(1024);
    
    この例はファイルの前の1024バイトを切り取ります。
    FileChanelのフォース方法FileChannel.force()方法は、チャネルにディスクに書き込まれていないデータをディスクに強制的に書き込む。パフォーマンスの観点から、オペレーティングシステムはデータをメモリにキャッシュするので、FileChannelに書き込まれたデータは必ずディスクに書き込まれるとは保証できない。これを保証するには、force()メソッドを呼び出す必要があります。force()方法は、ファイルメタデータ(権限情報など)をディスク上に同時に書き込むかどうかを指定するbooleanタイプのパラメータを有する。
    以下の例はファイルデータとメタデータを同時にディスクに強制的に書き込みます。
    channel.force(true);