【コラム】

Java API、使ってますか?

11 "NIO.2"がやってきた - JSR 203: More New I/O APIs for the Java Platform

11/60

待望のNIO.2の全貌が明らかに

J2SE 1.4がリリースされたのはもう5年も前のことだが、そのときに追加されたAPIに入出力機能を拡張する「New I/O」がある。New I/OははJSR 51として標準化されているAPIで、バッファを用いた入出力やノンブロッキング入出力、ファイルのロックやメモリへのマッピングなどといった機能を提供する。これらの機能は非常に強力であり、入出力の効率を上げるには不可欠の存在だが、一方で未完成な部分が多々あり、JCPでは後継となる「NIO.2」の策定作業が進められていた。

4月12日、そのNIO.2のEarly Draftがついに公開された。NIO.2の仕様策定は「JSR 203: More New I/O APIs for the Java Platform ("NIO.2")」として進められており、これが最終的にJava SE 7に取り込まれる予定になっていることはすでに本連載の第5回でも触れた通りである。

NIO.2では以下の3つを主な課題として掲げている。

  • ファイルシステムに対する新しいインタフェースの提供
  • ソケットやファイルに対する非同期入出力操作の実現
  • NIOのソケットチャネル機能の完成

公開されたEarly DraftはJCPのサイトからダウンロードすることができる。さっそくその中身を確認してみよう。なお、スペックリードであるAlan Bateman氏のブログではNIO.2の概要を紹介したスライドも公開されているので、そちらも参照してもらいたい。

新しいファイルシステムAPI

NIO.2では抽象的なファイルシステムインタフェースを用意することで、さまざまなファイルシステムを透過的に扱うことができる。たとえばSMBやFTP、SMTP、データベースなどを、ローカルファイルシステムと同様に扱えるようになる。

ファイルシステムにアクセスする方法は、新たに追加されたjava.nio.filesystemsパッケージのクラス/インタフェースによって提供される。また、ファイルシステムのためのサービスプロバイダはjava.nio.filesystems.spiパッケージに用意されている。

java.nio.filesystemsパッケージにはファイルシステムにアクセスするためのFileSystemクラスが定義されている。APIドキュメントを見た限りだと、FileSystemオブジェクトはFileSystemsクラスを利用してリスト1のようにして取得できるようだ。FileSystemsのnewFileSystem()メソッドは、FileSystemProvider.providers()メソッドによってその環境で利用できるファイルシステムプロバイダを取得し、そこからFileSystemオブジェクトを取得して返す。

リスト1 FileSystemオブジェクトの取得

FileSystem fileSystem = FileSystems.newFileSystem("/default/directory", false);

また、リスト2のようにすることでプラットフォームのデフォルトのFileSystemを取得することができ、これが既存のjava.io.Fileクラスを使ったファイルへのアクセスと同等のものになっているらしい。

リスト2 デフォルトのFileSystemオブジェクトの取得

FileSystem fileSystem = FileSystems.getDefault();

java.nio.filesystemsパッケージには、そのほかにもファイルやディレクトリのパスを表すPathクラスや、ファイルやパスに対する参照を表すFileReference/PathReferenceクラスなどが定義されている。PathやPathReferenceなどのオブジェクトはFileSystemオブジェクトから取得し、実際にファイルファイルやディレクトリの操作を行うことができる。また、これらのクラスによってシンボリックリンクなども適切に扱うことができるようになる。

java.nio.filesystemsパッケージにはサブパッケージとしてjava.nio.filesystems.attributesというパッケージが用意されている。名前からもわかるように、このパッケージではファイルやファイルシステムの属性にアクセスするためのクラス/インタフェースが提供される。

java.nio.filesystems.attributesパッケージでは属性に対するViewを定義したAttributeViewインタフェースとその実装クラスが用意されており、これによってさまざまなタイプの属性にアクセスすることができる。また、各属性を表すAttributeインタフェースとその実装クラスもこのパッケージで提供される。

たとえばサイズや更新日時などといった標準のファイル属性は、リスト3のようにして取得する。

リスト3 ファイル属性へのアクセス

FileReference file = ...;
BasicAttributes attrs = file.readBasicFileAttributes();
long size = attrs.getSize();                    // ファイルサイズを取得
long modifiedTime = getLastModifiedTime();      // 最終更新時間を取得

また、Viewを用いればリスト4のようにして属性を変更することができる。

リスト4 ファイル属性の変更

FileReference file = ...;
BasicFileAttributeView view = 
    file.newFileAttributeView(BasicFileAttributeView.class);
view.updateLastModifiedTime(System.currentTimeMillis(), TimeUnit.MILLISECONDS);

非同期入出力

NIO.2ではファイルとソケットの両方で非同期入出力がサポートされる。java.nio.channelsパッケージには非同期入出力のためのチャネルを定義したAsynchronousChannelクラスと、そのサブクラスであるAsynchronousFileChannel、AsynchronousSocketChannel、AsynchronousServerSocketChannel、AsynchronousDatagramChannelが用意されている。これらのクラスは、名前の通りファイルやソケットへの非同期アクセスを可能にする。

たとえば、非同期のソケットチャネルからデータを読み込むコードとしてはリスト5のような例が挙げられている。

リスト5 非同期ソケットの使用例

AsynchronousSocketChannel channel = AsynchronousSocketChannel.open();

channel.read(buffer, new CompletionHandler() {
    public void completed(IoFuture result) {
        try {  
            int bytesRead = result.getNow();
               ...
            } catch (ExecutionException x) { 
               ...
        }
    }
});

ここで使われているCompletionHandlerインタフェースは、非同期通信が終了した際に実行する処理を記述するためのハンドラである。IoFutureインタフェースはjava.util.concurrent.Futureのサブインタフェースで、非同期通信操作に対する結果を表す。

その他、NIO.2ではAsynchronousChannelGroupクラスを使用することで非同期チャネルをグループ化して扱うこともできるようになっている。

ソケットチャネル

ソケットチャネル機能についてはJSR 51の段階でもすでに実装されていたが、当初の目的に対して未完成な部分も多く、NIO.2ではその完成が望まれていた部分でもある。したがってNIO.2ではソケットチャネルの機能を提供するjava.nio.channelsパッケージに対して大幅な修正が加えられた。例えば、以下のような点が変更されている。

  • NetworkChannelインタフェースが追加され、ネットワークに対するチャネルのクラス(SocketChannel、ServerSocketChannelなど)がこれをimplementsするようになった
  • 各チャネルに対して細かな修正が加えられた
  • ソケットオプションを指定するためのSocketOptionクラスが追加された
  • MulticastChannelインタフェースが追加され、データグラムチャネルのクラス(DatagramChannelなど)がこれをimplementsするようになった
  • データグラムチャネルを開く際にプロトコルファミリーを指定する

なお公開されたAPIドキュメントには変更点が[new]や[revised]などとして明記されているので、詳細はそちらを参照して欲しい。

NIO.2のEarly Draft Reviewは5月27日まで続けられ、エキスパートグループに同ドラフトに関するフィードバックを送ることができる。また、NIO.2について議論をするためのメーリングリストも用意されており、誰でも自由に参加することができるようになっている。

11/60

インデックス

連載目次
第60回 どうなる? 今後のJavaプラットフォーム(Java SE編)
第59回 どうなる? 今後のJavaプラットフォーム(Java EE編)
第58回 Java SE 7の要注目機能"クロージャ"はどうなるのか その6
第57回 Java SE 7の要注目機能"クロージャ"はどうなるのか その5
第56回 Java SE 7の要注目機能"クロージャ"はどうなるのか その4
第55回 Java SE 7の要注目機能"クロージャ"はどうなるのか その3
第54回 Java SE 7の要注目機能"クロージャ"はどうなるのか その2
第53回 Java SE 7の要注目機能"クロージャ"はどうなるのか
第52回 Early Draftが公開されたJSF 2.0
第51回 EJBから独立したJava Persistence 2.0
第50回 モバイルJavaの新しい潮流となるか - MSA 2.0のドラフト公開
第49回 やっぱり基本はServlet - Servlet 3.0のEarly Draftを読む
第48回 JOGLで3Dプログラミング その4
第47回 JOGLで3Dプログラミング その3
第46回 JOGLで3Dプログラミング その2
第45回 JOGLで3Dプログラミング
第44回 JARファイルを効率的にネットワーク転送するためのPack200形式
第43回 Early Draftで把握するEJB 3.1の新機能
第42回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その2
第41回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その1
第40回 リソースアダプタによる接続の仕組み
第39回 JCAを利用したシステム間接続
第38回 Java EEと外部システムの接続性を支えるJCAがバージョンアップ
第37回 Javaのモジュラリティ強化を担う"スーパーパッケージ"とは
第36回 JSR 308対応のコンパイラを試す
第35回 公開されたJSR 308のEarly Draftを検証する
第34回 スクリプト言語とJavaを結びつけるJSR 223
第33回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その2
第32回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その1
第31回 Javaの文法がそのまま使えるスクリプト言語"BeanShell"
第30回 Javaアプリケーションにオブジェクトのキャッシュ機構を提供するJCache API
第29回 Javaアプリケーションからのリソース管理を可能にするJSR 284
第28回 XMLデータソースへの問い合わせはJSR 225で
第27回 Portlet Specification 2.0をもっと手軽に利用する
第26回 次期Javaポートレット仕様となるJSR 286
第25回 JSFとポートレットをつなげるJSR 301
第24回 Webサービス向けのポートレット仕様「WSRP」
第23回 高い相互運用性を実現するポートレットAPI - JSR 168
第22回 Java EE環境でタスクのスケジューリングを可能にするJSR 236
第21回 Java EE環境でのスレッドプログラミングを可能にするJSR 237
第20回 音声認識/合成のためのAPI - Java Speech APIとJSR 113
第19回 JSR 291でJavaプラットフォームにダイナミックコンポーネントモデルを導入
第18回 JAX-RSで簡単RESTful - JSR 311
第17回 待望のServlet 3.0がJSRに登場 - JSR 315
第16回 アノテーションを使ってバグ退治 - JSR 305
第15回 アノテーションをさらに広い範囲で利用可能にするJSR 308
第14回 Webアプリケーション開発の要となるか - JSF 2.0がJSRに登場
第13回 Webサービス経由でのJMX Agentへの接続を可能にするJSR 262
第12回 Javaアプリケーションのモジュール化をサポートするJava Module System
第11回 "NIO.2"がやってきた - JSR 203: More New I/O APIs for the Java Platform
第10回 JSR 295: Beans Bindingの参照実装を試す
第9回 けっこう便利! 単位を扱うAPI -- JSR 275: Units Specification
第8回 アノテーションでバリデーション - JSR 303: Bean Validator
第7回 Swing開発の救世主となるか - Swing Application Framework
第6回 JavaBeansのプロパティを同期させるバインディングAPI
第5回 誰よりも早く"Java SE 7"を睨む
第4回 日時情報の取り扱いを改善する JSR 310: Date and Time API
第3回 古いAPIも進化している!? - JSR 919: JavaMail 1.4
第2回 JSR 1 リアルタイムJava仕様
第1回 JCPによって進められるJava関連技術の標準化

もっと見る

提供:マイナビ

会員登録はこちら

大学・大学院・短大・専門学生向けの就職情報サイト「マイナビ2010」「マイナビ2009」に今すぐ登録しよう!  大手企業からベンチャー企業までの約13,000社の企業情報を公開、エントリーが可能です。2010年卒予定の方は「マイナビ2010」に、2009年卒予定の方は「マイナビ2009」に登録してください。

毎日コミュニケーションズはプライバシーマークを取得しています。



人気記事

一覧

イチオシ記事

新着記事