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