3.ファイルチャネル
- 3.1. チャネル(Channel)
- 3.2. ファイルチャネル(FileChannel)
- 3.3. MappedByteBuffer
- 3.4. ロック
3.1. チャネル(Channel)
チャネルは、ネットワークやファイルなどへの入出力操作を行うための接続です。java.ioパッケージのInputStreamやOutputStreamなどのような役割を持ちます。
チャネルに関するクラスは、java.nio.channels パッケージに含まれます。すべてのチャネルはChannel インタフェース、またはそのサブインタフェースを実装しています。java.nio.channels パッケージには、以下のようなインタフェースが存在します。
インタフェース名 |
説明 |
Channel |
チャネル |
ReadableByteChannel |
バイトを読み込むことのできるチャネル |
WritableByteChannel |
バイトを書き込むことのできるチャネル |
ByteChannel |
バイトを読み書きすることのできるチャネル |
ScatteringByteChannel |
複数のバッファに一括で読み込みができるチャネル |
GatheringByteChannel |
複数のバッファの内容を一括で書き込みができるチャネル |
InterruptibleByteChannel |
非同期クローズのできるチャネル |
これらのインタフェース間には次のような継承関係があります。
Channelインタフェースはすべてのチャネルの基本となるインタフェースです。チャネルが開いているかどうかを調べるisOpenメソッドと、チャネルを閉じるcloseメソッドのみが定義されてます。
- boolean isOpen()
- void close()
ReadableByteChannelには、チャネルからバッファにデータを読み込むreadメソッドが定義されています。このメソッドではチャネルからデータを読み取り、バッファの「位置」以降にデータを書き込みます。最大でバッファの「位置」から「リミット」までのバイト数のデータをチャネルから読み込みます。
- int read(ByteBuffer dst)
WritableByteChannelには、バッファの内容をチャネルに書き込むwriteメソッドが定義されています。このメソッドではバッファの「位置」から「リミット」までのデータをチャネルに書き込みます。
- int write(ByteBuffer src)
ByteChannelはReadableByteChannelとWritableByteChannelを継承しているだけで新しいメソッドは定義されていません。
ScatteringByteChannelはReadableByteChannelを継承しており、複数のバッファにデータを連続して読み込むメソッドが定義されています。配列の各要素を引数としてReadableByteChannelのreadメソッドを連続して実行するのと同じような動作をします。offsetとlengthを指定すると、バッファ配列の一部分だけを対象とすることができます(dsts[offset] dsts[offset+length-1]が対象となります)。
- long read(ByteBuffer[] dsts)
- long read(ByteBuffer[] dsts, int offset, int length)
GatheringByteChannelはWritableByteChannelを継承しており、複数のバッファのデータを連続してチャネルに書き込むメソッドが定義されています。ReadableByteChannelと同じようにバッファ配列の一部分だけを対象とすることもできます。
- long write(ByteBuffer[] srcs)
- long write(ByteBuffer[] srcs, int offset, int length)
InterruptibleChannelはChannelを継承しています。InterruptibleChannelのclose()メソッドは、別のスレッドが同じチャネルの入出力操作でブロック状態であったとしても、その処理を中断してチャネルを閉じることができます。ブロック状態にあったスレッドではjava.nio.channelsAsynchronousCloseExceptionが発生します。
- void close()