- 3.1. チャネル(Channel)
- 3.2. ファイルチャネル(FileChannel)
- 3.3. MappedByteBuffer
- 3.4. ロック
3.2. ファイルチャネル(FileChannel)
FileChannel は、ファイルへの読み書き処理を行うためのチャネルです。前節で説明したインタフェースをすべて実装しています。
FileChannelクラスには、現時点(JDK1.4.2)ではファイルに接続されたチャネルオブジェクトを作成するためのメソッドは用意されておらず、FileInputStream/FileOutputStream/RandomAccessFileのgetChannelメソッドを使用して取得します。
FileChannel fc = new FileInputStream("sample.txt").getChannel();
これらのgetChannelメソッドを使用して作成されたFileChannelは、作成の元となったストリーム等と密接にもっており、どちらかで行った操作はもう一方のオブジェクトにも影響を与えます。たとえば、FileChannelでは現在ファイルのどの位置に対して読み書きしているかという情報を属性として持っており、ストリームで入出力操作を行うとFileChannelでの位置も変化します。
チャネルへの読み書き操作に関しても、元となったオブジェクトの種類によって次のような制限があります。
- FileInputStreamから作成した場合、読み込み専用。
- FileOutputStreamから作成した場合、書き込み専用。
- 読み込み専用モードのRandomAccessFileから作成した場合、読み込み専用。
- 読み書きモードのRandomAccessFileから作成した場合、読み書き可能。
チャネルの入出力は、基本的にバッファを介して行われます。FileChannelには以下のようなメソッドが存在しています。
- int write(ByteBuffer src)
- int write(ByteBuffer src, long position)
- long write(ByteBuffer[] srcs)
- long write(ByteBuffer[] srcs, int offset, int length)
- int read(ByteBuffer dst)
- int read(ByteBuffer dst, long position)
- long read(ByteBuffer[] dsts)
- long read(ByteBuffer[] dsts, int offset, int length)
ReadableByteChannel,ScattableByteChannel,WritableByteChannel,GatheringByteChannelに定義されているread/writeメソッドに加え、入出力するファイルの位置(position)を指定するメソッドが追加されています。
readメソッドにおいて、読み込みのために用意されているバッファ領域の最後に到達する前にファイルの終端に到達してしまった場合はそこで処理が終了します。write/readメソッドは、戻り値として転送されたデータのバイト数を返します。すでにファイルの終端に達している状態から読み込みを行おうとした場合、戻り値は-1となります。
FileChannelには現在読み書きを行っている位置はpositionメソッドにより取得・設定できます。read/writeメソッドを実行することによって位置は変化します。
- long position()
- FileChannel position(long newPosition)
チャネルの現在のサイズはsizeメソッドにより取得できます。ファイルに書き込みを行ってファイルサイズが変化した場合はチャネルのサイズも変化します。
- long size()
(実習課題1)
以下の仕様を満たすアプリケーションを作成してください。
- ファイルを読み込み、その内容をすべてビット反転した新しいファイルを出力するプログラム。
- 1番目の引数で入力するファイル名を指定すること。
- 2番目の引数で出力するファイル名を指定すること。
- ファイルの入出力にはFileChannelを使用すること。
- 処理にかかった時間をミリ秒単位でコンソールに出力すること。