第104回 ファイルチャンネルの入出力
今回からは「ファイルチャンネルの入出力」について見ていきます。
FileChannelはファイル入出力用のチャンネルです。
FileChannelはFileInputStream、FileOutputStream、RandomAccessFileのgetChannelメソッドで取得できます。
FileChannelはファイルの現在位置(position)を持っています。
FileChannelはバイトを読み込むためのReadableByteChannelインターフェース、ScatteringByteChannelインターフェースを実装しており、これらのreadメソッドを実行すると、現在位置からバイトを読み込みます。
また、現在位置は読み込まれた分だけ移動します。
 次のプログラムの実行によりreadメソッド実行直後のpositionの値を確認します。
256の容量を持つバッファを使用します。
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
 public class Main {
     public static void main(String[] args) {
         FileChannel fileChannel = null;
         try {
             FileInputStream fileInputStream = new FileInputStream("input.txt");
             fileChannel = fileInputStream.getChannel();
             ByteBuffer byteBuffer = ByteBuffer.allocate(256);
             byte[] bytes = new byte[byteBuffer.capacity()];
             while (fileChannel.read(byteBuffer) > 0) {
                 System.out.println("position:" + fileChannel.position());
                 byteBuffer.flip();
                 byteBuffer.get(bytes, 0, byteBuffer.limit());
                 byteBuffer.clear();
             }
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             try {
                 fileChannel.close();
             } catch (Exception e) {}
         }
     }
 }
実行すると次のように表示されます。
position:256
 position:512
 position:768
 position:1024
 position:1280
 position:1536
 position:1792
 position:2048
 position:2304
 position:2560
以下、positionの値はファイルのサイズに達するまで256ずつ加算されます。
ちなみに、FileChannelクラスにはチャネルの現在位置に影響を及ぼすことなく、ファイル内の絶対位置から読み込むreadメソッドも存在します。

