初出 JAVA PRESS Vol.29

Java API ダイジェスト

java.nioパッケージ

データ入出力のパフォーマンスを向上させるNew I/O の威力

New I/OはJCPのJSR-51において策定され、J2SE v1.4で新しく加わった入出力処理を行うためのライブラリです。New I/Oは次のようなゴールを目指してデザインされました。

ただし、これらがすべてJ2SE v1.4で実現されたわけではなく、書式つき入出力とファイルシステムインターフェースはJ2SE v1.5に持ち越されてしまいました。

New I/Oの主な機能を表1に示します。以下、それぞれの機能を簡単に紹介しますが、正規表現はjava.nioパッケージのサブパッケージではないため解説は省略させていただきます。

表 1 J2SE v1.4 で追加された New I/O の主な機能

追加された機能 説明 パッケージ
バッファ プリミティブに特化した容量固定のコンテナ java.nio
チャネル 入出力処理を効率よく行うためのファイルやソケットなどへのコネクション java.nio.channels
非同期入出力 ノンブロッキングな入出力処理のサポート java.nio.channels
文字集合クラス 文字集合を表すクラスと、そのエンコーダ/デコーダクラス java.nio.charset
正規表現

正規表現のサポート

java.util.regrex

バッファ

バッファはboolean型を除いたプリミティブ型に特化したコンテナクラスです。バッファの主な特徴を次に示します。

  1. 容量の拡張が不可
  2. シーケンシャルアクセス
  3. Javaのヒープ外のメモリへの直接アクセスをサポート
  4. メモリにマップされたファイルをサポート

Buffer クラスはabstractクラスなので、使用するのはプリミティブ型に応じた派生クラスです。Bufferクラスは共通機能、派生クラスでは要素にアクセスするためのメソッドなどが定義されています。

New I/Oではヒープ外にバッファを割り付けることができるようになり、大容量でしかも高速にアクセスすることができるようになりました。また、ファイルをメモリにマップすることもできるようになり、これのアクセスにもバッファが使用されます。

チャネル

ファイルやソケットへのコネクションを表すのがチャネルです。Channelインタフェースは単にコネクションを表し、入出力処理は派生インタフェースで定義されています。チャネルが読み書きできるのはbyte列だけで、ByteBufferクラスを使用して行います。チャネルの主なインタフェースとクラスを図1に示します。

チャネルの主な機能は

ストリームと異なり、チャネルはすべてインタフェースがベースで定義されており、機能追加が容易に行えます。また、単一のクラスで入出力の両方を行うことができます。

非同期クローズと非同期割り込みは、入出力処理を行っているスレッド以外のスレッドからのクローズや割り込みです。これらに関する明確な仕様はいままで定義されていませんでしたが、New I/Oはこれらに対応する例外が定義されています。

図1 チャネルのクラス図

非同期入出力

チャネルの機能の1つに非同期入出力があります。従来、ソケットは1対1に対応するスレッドが使用され、扱うソケット数が多くなるとスレッドも増加してしまうという問題がありました。非同期入出力を使用するとブロッキングが起こらないので、単一のスレッドで複数のソケットを扱うことができます。

非同期入出力はSelectableChannelクラスの派生クラスであるServerSocketChannelクラスとSocketChannelクラスで使用することができます。また、これらのクラスと共に使用されるのがSelectorクラスです。

文字集合クラス

New I/Oでは文字集合を表すクラスが導入されました。また、エンコード・デコードのためのクラスも定義されており、文字コードの変換をアプリケーションが行うことができます。

また、新たな文字集合を追加することも可能になっています。

文字集合クラスで表せる文字集合はまだそれほど多くありませんが、徐々に拡張されています。例えば、Shift_JISはJ2SE v1.4では使用できませんでしたが、v1.4.1でサポートされました。今後、v1.4.2、v1.5とバージョンが進んでいけば、サポートされる文字集合も増加していくと思われます。


New I/OはJ2SE v1.4で導入されたAPIですが、JSR-203ではJ2SE v1.5向けの機能強化が検討されています。まだ結論は出ていませんが、次のような項目が挙げられています。

これまで紹介してきたNew I/Oですが、クライアントサイドだけなく、大量の入出力処理が行われるサーバサイドでより有効となるAPIです。J2EEでもv1.4からNew I/Oを使用することができるので、ぜひとも身につけておきたいAPIです。

 

各クラスの詳細

参考

JSR-51 New I/O APIs for the Java Platform
http://jcp.org/en/jsr/detail?id=51

JSR-203 More New I/O APIs for the Java Platform ("NIO.2")
http://jcp.org/en/jsr/detail?id=203

 

(2003.03)