Java™ Platform
Standard Edition 7

パッケージ java.nio.channels

入出力操作を実行できるエンティティー (ファイル、ソケットなど) への接続を表すチャネルや、多重化された非ブロック入出力操作用のセレクタを定義します。

参照: 説明

パッケージ java.nio.channels の説明

入出力操作を実行できるエンティティー (ファイル、ソケットなど) への接続を表すチャネルや、多重化された非ブロック入出力操作用のセレクタを定義します。

チャネル

説明

Channel 入出力操作が行われる場所
  ReadableByteChannel バッファーへの読み込みを行う
    ScatteringByteChannel   バッファーシーケンスへの読み込みを行う 
  WritableByteChannel バッファーからの書き出しを行う
    GatheringByteChannel バッファーシーケンスからの書き込みを行う 
  ByteChannel バッファーへの読み込み、バッファーからの書き込みを行う 
    SeekableByteChannel 可変長のバイトシーケンスが含まれているエンティティーに接続された ByteChannel
  AsynchronousChannel 非同期入出力操作をサポートする。
    AsynchronousByteChannel 非同期でバイトの読み取りと書き込みを行う
  NetworkChannel ネットワークソケットへのチャネル
    MulticastChannel IP (Internet Protocol) マルチキャストグループに参加できる
Channels チャネルとストリームの相互運用のためのユーティリティーメソッド

チャネルは、ハードウェアデバイス、ファイル、ネットワークソケットのほか、1 つ以上の個別の入出力操作 (読み込み、書き込みなど) を実行できるプログラムコンポーネントなどのエンティティーへのオープン接続を表します。Channel インタフェースに指定されているとおり、チャネルの状態はオープンかクローズのどちらかです。どちらの状態のチャネルも、非同期クローズ可能かつ割り込み可能です。

Channel インタフェースは、いくつかのほかのインタフェースによって拡張されます。

ReadableByteChannel インタフェースは、チャネルからバッファーにバイトを読み取る read メソッドを指定します。同様に、WritableByteChannel インタフェースは、バッファーからチャネルにバイトを書き込む write メソッドを指定します。ByteChannel インタフェースは、これら 2 つのインタフェースを統一したインタフェースであり、バイトの読み込みと書き出しの両方を実行できる一般的なチャネルで使用されます。SeekableByteChannel インタフェースは、チャネルの現在の位置とそのサイズ照会および変更するメソッドで ByteChannel インタフェースを継承したものです。

シングルバッファーではなく複数のバッファーのシーケンスを使用する read メソッドと write メソッドを追加することにより、ScatteringByteChannel インタフェースは ReadableByteChannel インタフェース、GatheringByteChannel インタフェースは WritableByteChannel インタフェースを継承します。

NetworkChannel インタフェースは、チャネルのソケットをバインドして、ソケットのバインド先のアドレスを取得するためのメソッドを指定し、ソケットオプションを取得して設定するためのメソッドを指定します。MulticastChannel インタフェースは、IP (Internet Protocol) マルチキャストグループに参加するためのメソッドを指定します。

Channels ユーティリティークラスは、java.io パッケージのストリームクラスとこのパッケージのチャネルクラスの連携をサポートする static メソッドを定義します。適切なチャネルは、InputStreamOutputStream から構築できます。反対に、InputStreamOutputStream は、単一のチャネルから構築できます。Reader は、指定された文字セットを使って指定された読み込み可能なバイトチャネルのバイトをデコードするように構築できます。反対に、Writer は、指定された文字セットを使って文字をバイトへエンコードし、指定された書き込み可能なバイトチャネルに書き込むように構築できます。

ファイルチャネル

説明

FileChannel ファイルの読み込み、書き込み、マッピング、操作
FileLock ファイルの (領域の) ロック
MappedByteBuffer   ファイル領域にマッピングされるダイレクト byte バッファー 

FileChannel クラスは、現在のファイル位置の照会および変更、ファイルの末尾の切り詰めによる特定のサイズへの変更のほか、ファイルに接続されたチャネルからのバイトの読み込み、ファイルに接続されたチャネルへのバイトの書き込みといった一般的な操作をサポートします。このクラスは、ファイル全体またはファイル内の特定の領域のロックを獲得するメソッドを定義します。こうしたメソッドは、FileLock クラスのインスタンスを返します。{@link java.nio.channels.FileChannel} クラスは、ファイルの更新内容を、このファイルが格納されている記憶装置に強制的に書き込むメソッドも定義します。こうしたメソッドにより、ファイルとその他のチャネル間のバイトのやりとりが効率化されます。また、ファイル領域を直接メモリーにマッピングできるようになります。

FileChannel は、その静的な open メソッドの 1 つを呼び出すか、java.io クラスと同じ基礎となるファイルに接続されているファイルチャネルを返すために FileInputStreamFileOutputStream、または RandomAccessFilegetChannel メソッドを呼び出すことで作成されます。

多重化された非ブロック入出力

説明

SelectableChannel 多重化可能なチャネル
  DatagramChannel データグラム型ソケットへのチャネル
  Pipe.SinkChannel パイプの書き込み側
  Pipe.SourceChannel パイプの読み込み側
  ServerSocketChannel   ストリーム型リスニングソケットへのチャネル
  SocketChannel ストリーム型接続ソケットのチャネル
Selector 選択可能チャネルのマルチプレクサ
SelectionKey セレクタへのチャネルの
登録を表すトークン  
Pipe 単方向パイプを形成する 2 つのチャネル 

セレクタ選択可能チャネル選択キーによって提供される多重化された非ブロック入出力は、スレッド指向のブロック入出力よりスケーラブルです。

セレクタ選択可能チャネルのマルチプレクサです。選択可能チャネルは、非ブロックモードに分類できる特殊なタイプのチャネルでもあります。多重化入出力操作を実行するには、まず選択可能チャネルを 1 個以上作成して、これを非ブロックモードにして、セレクタに登録します。チャネルを登録すると、一連の入出力操作が指定されます。セレクタは、準備の一環としてこれらの操作をテストし、登録を表す選択キーを返します。

セレクタにチャネルを登録したら、範囲があらかじめ宣言されている 1 個以上の操作の実行が可能になったチャネルを検出するため、選択操作を実行できます。チャネルの準備ができていれば、登録時に返されたキーがセレクタの選択キーセットに追加されます。このキーセットと、このセットに含まれるキーを調べることにより、各チャネルが実行できる操作を判断できます。要求された入出力操作を実行するため、各キーから対応するチャネルを取得できます。

選択キーは、そのチャネルがある操作を実行できる状態になっていることを示します。ただし、これは単なるヒントであって、スレッドがブロックされることなくある操作を実行できることを保証するわけではありません。ヒントの内容が明らかに不正な場合は、これを無視するために、多重化入出力処理を実行するコードを書き込む必要があります。

このパッケージは、java.net パッケージに定義された DatagramSocketServerSocket、および Socket クラスに対応する選択可能チャネルクラスを定義します。これらのクラスには、チャネルに関連したソケットをサポートできるように、小規模な変更が加えられています。このパッケージは、単方向パイプを実装する単純なクラスも定義します。新しい選択可能チャネルは常に、対応するクラスの static open メソッドを呼び出すことによって作成されます。チャネルが関連ソケットを必要としている場合は、この操作の副作用としてソケットが作成されます。

セレクタ、選択可能チャネル、選択キーの実装を置き換えるには、java.nio.channels.spi パッケージに定義されている SelectorProvider クラスの代替定義またはインスタンスを「プラグイン」します。ただし、この機能は、すべての開発者を対象とした機能ではありません。これは、非常に高い性能が要求される場合に、オペレーティングシステム固有の入出力多重化メカニズムを活用できるようにする、上級ユーザー向け機能です。

多重化入出力の抽象化を実装するために必要とされる登録および同期処理は、ほとんどの場合、java.nio.channels.spi パッケージの AbstractInterruptibleChannelAbstractSelectableChannelAbstractSelectionKey、および AbstractSelector クラスによって実行されます。カスタムセレクタプロバイダを定義する際、直接サブクラス化されるのは AbstractSelector クラスと AbstractSelectionKey クラスだけです。カスタムチャネルクラスは、このパッケージに定義されている適切な SelectableChannel サブクラスを拡張する必要があります。

非同期入出力

説明

AsynchronousFileChannel ファイルの読み込み、書き込み、操作用の非同期チャネルです
AsynchronousSocketChannel ストリーム型接続ソケットへの非同期チャネルです
AsynchronousServerSocketChannel   ストリーム型リスニングソケットへの非同期チャネルです
CompletionHandler 非同期操作の結果を消費するためのハンドラ
AsynchronousChannelGroup リソースを共有するための非同期チャネルのグループ化

Asynchronous channels は、非同期入出力操作が可能な特殊なタイプのチャネルです。非同期チャネルは非ブロックであり、非同期操作を開始するためのメソッドを定義して、それぞれの操作の保留にされている結果を表す Future を返します。Future を使用して、操作の結果をポーリングするか待機することができます。非同期入出力操作は、操作の完了時に呼び出す CompletionHandler を指定することもできます。終了ハンドラは、入出力操作の結果を消費するために実行されるユーザー指定のコードです。

このパッケージは、ストリーム型接続またはリスニングソケット、またはデータグラム型ソケットに接続されている非同期チャネルクラスを定義します。これは、ファイルの非同期読み取り、書き込み、および操作のための AsynchronousFileChannel クラスも定義します。FileChannel と同様に、ファイルの末尾の切り詰めによって特定のサイズに変更する、ファイルの更新内容をストレージデバイスに強制的に書き込む、またはファイル全体またはファイル内の特定の領域のロックを取得する操作をサポートします。FileChannel とは異なり、ファイルディレクトリの領域をメモリーにマッピングするためのメソッドは定義しません。メモリーにマッピングされた入出力が必要な場合は、FileChannel を使用できます。

非同期チャネルは、リソース共有のために非同期チャネルグループにバインドされます。グループには、グループ内のチャネルで実行される非同期操作の結果を消費する入出力イベントを処理して、終了ハンドラにディスパッチするために、タスクの送信先の関連する ExecutorService があります。チャネルの作成時にオプションでグループを指定したり、チャネルをデフォルトグループにバインドしたりすることができます。上級ユーザーは、独自の非同期チャネルグループを作成するか、デフォルトグループに使用する ExecutorService を構成できます。

セレクタと同様に、非同期チャネルの実装を置き換えるには、java.nio.channels.spi パッケージに定義されている AsynchronousChannelProvider クラスの代替定義またはインスタンスを「プラグイン」します。ただし、この機能は、すべての開発者を対象とした機能ではありません。これは、非常に高い性能が要求されるときに、オペレーティングシステム固有の非同期入出力メカニズムを活用できるようにする、上級ユーザー向け機能です。


ほかで指定がない場合、null 引数をこのパッケージの任意のクラスまたはインタフェースのメソッドまたはコンストラクタへ渡すと、NullPointerException がスローされます。

導入されたバージョン:
1.4
Java™ Platform
Standard Edition 7

バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.