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

