【レポート】
New I/O APIはJavaプログラムにおける入出力機能を拡張する目的でJ2SE 1.4よりJavaプラットフォームに追加された機能である。実は当時リリースされたNew I/Oはまだ未完成な存在であり、その後も継続して仕様改定のための議論が続けられ、次期JavaプラットフォームとなるJava SE 7に追加される見通しとなっている。これは一般に「NIO.2」と呼ばれているもので、JSR 203として標準化が進められている。
なおNIO.2については以前、コラムで取り上げたことがあるが、今回レポートする内容はその後の最新動向ということになる。
|
|
|
Google社のCarl Quinn氏 |
Sun MicrosystemsのAlan Bateman氏 |
まずNIO.2ではさまざまなファイルシステムを透過的に扱うための抽象的なインタフェースが用意される。これによって異なるファイルシステムに対する入出力を統一された方法で記述できるようになる。このAPIのためにjava.nio.filesystemとjava.nio.filesystem.attributeという2つの新しいパッケージが追加され、前者にはファイルシステムにアクセスするための機能が、後者にはファイルやディレクトリの属性を扱うための機能が提供されるという。
まずjava.nio.filesystemパッケージではファイルシステム上のリソースにアクセスするためのFileSystemクラスやファイルやディレクトリのパスを表すPathクラス、ファイルやパスへの参照を表すFileRefsクラスなどが用意される。たとえばPathクラスを利用した場合ファイルのコピーはリスト1.1のように行えるという。コピーの際にオプションを指定することができ、この例ではファイル属性は保持したままで、かつすでにファイルが存在する場合には置き換えるという指定を行っている。
Path source = Path.get("C:\\My Document\\Stuff.odp");
Path target = Path.get("D:\\Buckup\\MyStuff.odp");
// 通常のコピー
source.copyTo(target);
// オプションを指定してのコピー
source.copyTo(target, REPLACE_EXISTING, COPPY_ATTRIBUTES);
NIO.2ではシンボリックリンクも適切に扱うことができるようになる。ファイル属性にリンク情報を保持されるようになるためで、リスト1.2のようにすることで対象のファイルがシンボリックリンクであるかどうかや、リンク元のファイルのパスを調べることが可能となる。
Path file = Path.get("/user/spool1");
// ファイルの属性を読み込む
BasicFileAttributes attrs = Attributes.readBasicFileAttributes(file, false);
if (attrs.isSymbolicLink()) {
// リンクのターゲットを読み込む
Path target = file.readSymbolicLink();
// 両ファイルが同じものかをチェック
asert file.isSameFile(file.resolve(target));
}
ディレクトリに対する入出力機能も大幅に拡張されるという。たとえばディレクトリ内のファイルを連続して扱うためのストリームとしてDirectoryStreamクラスが追加される。リスト3はDirectoryStreamを利用して.java拡張子を持つファイルをすべて表示するコードの例だ。
Path dir = Path.get("MyDir");
DirectoryStream stream = dir.newDirectoryStream("*.java");
try {
for (DirectoryEntry entry : stream) {
System.out.println(entry.getName());
}
} finally {
stream.close();
}
このほかにも高度なフィルタの設定やディレクトリツリーを容易に辿ることができる機能などが提供される予定だ。
java.nio.filesystems.attributesパッケージではファイルやディレクトリの属性を扱うための機能が提供される。NIO.2の属性へのアクセスはビューを介して行うモデルになっている。同パッケージにはさまざまなタイプの属性に対応したViewクラスや、各属性を表すAttributeインタフェースとその実装クラスが含まれるという。たとえば標準的なファイル属性の取得はBasicFileAttributeViewクラスを用いてリスト4のように行う。
BasicFileAttributeView view =
file.newFileAttributeView(BasicFileAttributeView.class, true);
BasicFileAttributes attrs = view.readAttributes();
POSIXに対応したファイル属性を扱うこともでき、たとえばリスト5のようにすればUNIX形式のファイルパーミッションの取得や設定が可能である。
PosixFileAttributes attrs =
Attributes.readPosixAttributes(file, true);
// ファイルパーミッションの表示
String mode = PosixFilePermission.toString(attrs.permmisions());
System.out.format("%s %s %s", mode, attrs.owner(), attrs.group());
// ファイルパーミッションの設定
Attributes.setPosixFilePermissions(file,
OWNER_READ, OWNER_WRITE, GROUP_WRITE, OTHERS_READ);
その他、DOS形式のファイルの属性やACLs(Access Control Lists)形式の属性など、さまざまなファイル形式に対応する予定とのことである。
上記以外のファイルシステムAPIの特徴的な機能としては、ファイル変更通知機能が紹介された。これはファイルに対して各種変更が行われた場合にイベント形式で通知を受け取るための機能であり、リスト6のような感じで利用するという。
WatchService watcher = FileSystems.getDefault().newWatchService();
// 監視するイベントのタイプを設定
Set events =
EnumSet.of(ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
WatchKey key = dir.register(watcher, events);
// イベントの待ち受けと処理
for( ; ; ) {
key = watcher.take();
for(WatchEevent> ev : key.pollEvents();) {
if (event.getType() == ENTRY_MODIFY) {
// ......
}
}
key.reset();
}
| 理研、脳・脊髄形成に必要な神経板湾曲の仕組みを解明 [20:16 5/25] |
| 京大、「慢性閉塞性肺疾患」患者の労作時呼吸困難は鍼治療が有効と実証 [20:08 5/25] |
| 120Hz SHVカメラ用イメージセンサーを使った撮像装置 - SHVフルスペック化へ [18:10 5/25] |
| 京大、視覚による物体認知は前頭前野からのトップダウン信号が重要と確認 [17:45 5/25] |
| 製品数の拡大だけでなくBCPの展開なども含めた総合力で事業の強化を図るTI [17:25 5/25] |
|
AKB宮澤佐江、ダービーは大穴勝負!「総選挙も"追い込み"たい」 [15:30 5/26] エンタメ |
|
【女性編】あまり知らない人とやることをためらわれることランキング [15:00 5/26] ライフ |
|
【男性編】あまり知らない人とやることをためらわれることランキング [15:00 5/26] ライフ |
|
[純と愛]夏菜が運命的出会い収録 大阪でクランクイン [15:00 5/26] エンタメ |
|
アニメ化記念「お兄ちゃんだけど愛さえあれば~」4コマ冊子 [14:45 5/26] ホビー |
4つの診断で、自分の適性を見つめなおそう!
働くこと・挑戦し続けることへの思いを綴ったインタビュー
あなたにピッタリのアドバイスを読むことができます。
転職に必要な情報が収集できます
企業からアプローチのメッセージが届きます。