Java SEには便利な機能が数多くあるのですが,新しい機能ほど活用されていないのではないでしょうか。筆者がJ2SE 1.4であまり使われていないのではないかと感じる機能を挙げてみます。

  • Assertion
  • New I/O
  • Image I/O
  • Preferences API
  • Logging API

AssertionやLogging APIは,JUnitやLog4Jなどのオープンソースのプロダクトで置き換えられるので,それほど使われていなくても不思議ではありません。

しかし,JPEGのイメージを出力するために,いまだにcom.sun.image.codec.jpeg.JPEGImageEncoderクラスを使用しているのは腑に落ちません。J2SE 1.3の頃に作られたアプリケーションであればわかりますが,J2SE 1.4以降に作られたアプリケーションではImage I/Oを使うべきではないでしょうか。

com.sun以下のパッケージは標準のパッケージではないため,いつなくなっても文句はいえません(参考:Why Developers Should Not Write Programs That Call 'sun' Packages)。また,com.sun.image.codec.jpeg.JPEGImageEncoderクラスに比較してImage I/Oは機能が向上しています。

となると,なおさらcom.sun.image.codec.jpeg.JPEGImageEncoderクラスを使用する理由が見あたりませんね。

J2SE 5.0では,次のような機能が使われていないのではないでしょうか。

  • Concurrency Utilities
  • JMX
  • ProcessBuilder
  • Instrumentation

J2SE 5のジェネリクス,メタデータは急速に普及していますが,それ以外の機能はなかなか使われていないようです。その前にJ2SE 5自体を使っていないという場合も多いようですが...

なぜ使われないのだろう?

使われていない機能はいろいろあるようですが,なぜ使われないのかを少し考えてみましょう。

筆者が考えつく理由をいくつか列挙します。

  1. そもそも,そんな機能など必要ない
  2. 単に知らなかった
  3. 知ってはいたけど,使うのが面倒くさそう
  4. 他のライブラリなどを使用しているため,必要ない

1は全く問題ありません。必要でないのに無理して使う必要はありませんね。でも,もしかしたら,不必要だと思っていた機能のうちに有効なものがあるかもしれませんが。

4は以前のバージョンの時から作成されたアプリケーションなどによくあるケースです。例えば,J2SE 1.3の頃には正規表現がなかったのでJakarta OROを使っていた,などといったケースです。アプリケーションをアップデートする場合でも,Jakarta OROをjava.util.regexに変更するメリットがなければ,変更する必要はありません。

また,他のライブラリと標準のライブラリで機能やパフォーマンスの比較をしたうえで,他のライブラリを選択することもあります。このケースもまったく問題ないと思います。例えば,log4jとlogging APIを比較して,log4jを選択したなんていうのは,よくある話です。

問題は2と3のケースです。

現在のJavaでは本当に多くの機能が提供されています。それらをすべて把握することは至難の業です。機能が多いので,使いたい機能を探すのもどんどん難しくなってきています。

皆さんはどうやって使いたい機能を探しますか?

Webと書籍,もしくは雑誌がほとんどですよね。特にWeb。

でも,いろいろな人に使われているライブラリならまだしも,あまり使われていない機能であれば,情報も極端に少なくなってしまいます。

また,書籍は情報が古く,新陳代謝により新しい機能が登場していても,言及されていないことがよくあります。出版された時代が古ければしかたありませんが,たとえ最近出版された本でも,改訂版だと古い記述が残っている,なんてこともよくあります。例えば,コレクションの説明でVectorクラスやHashtableクラスが出ていたら,もうその本は捨てていいかもしれません。もちろん,冗談ですけど。今はコレクションといえばListインタフェースとMapインタフェースだということは,皆さんご存じのとおりです。

使われていない機能の中には,便利なものも数多くあります。そうした機能を紹介していくのもこの連載の目的の一つだと思っています。

ということで前振りが長くなってしまいましたが,今月はあまり使われていない機能の代表としてNew I/Oをご紹介していきます。

New I/Oとは

New I/Oは,今までのストリームによる入出力に代わる,新しい入出力ライブラリです。とはいうものの,ストリームが要らないというわけではなく,目的によって使い分けます。

New I/Oは,入出力機能だけでなく,入出力に使用する配列に相当する機能なども含む総合的なライブラリです。

New I/Oの仕様はJCPで策定されました(JSR-51)。ちなみにJSR-51のスペック・リードは米Sun MicrosystemsのMark Reinhold氏でしたが,彼は現在Java SE 6(JSR-270)のスペック・リードになっています。また,JSR-51には日本から風間一洋氏も参加されていました。

New I/Oを構成するのは以下のような機能です。

機能 内容 補足
バッファ プリミティブ型に特化したデータ・コンテナ。コレクションよりも配列に近い性質を持つ。New I/Oで入出力されたデータはすべてバッファに格納される
チャネル バッファを使用して入出力を行うクラス群。従来のストリームに対応する。ファイルやソケットに対応するチャネルが提供されている
ノンブロッキング
入出力
処理のブロックを行わない入出力機能。UNIX系OSのselectシステムコールに相当する
文字セット 文字コードを表すクラス。 また,文字セットに対応するエンコーダとデコーダも提供されている
ファイル
インタフェース
ファイルのロックと,ファイルのメモリーへのマッピング
正規表現 正規表現
簡易フォーマット
入出力
C言語のprintf,scanfに相当する機能 Java SE 5.0より

現在はJava SE 7(開発コード名Dolphin)に向けて,New I/O 2の策定作業が進められています(JSR-203)。JSR-203ではファイルのメタデータを扱うための機能やファイルに対するノンブロッキング入出力などが検討されています。

さて,来週からこのNew I/Oをもう少し詳しく解説していきます。

著者紹介 櫻庭祐一

横河電機の研究部門に勤務。同氏のJavaプログラマ向け情報ページ「Java in the Box」はあまりに有名