EeBlog(テクニカルブログ)

第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メソッドも存在します。