IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

スーパーエンジニアの独り言

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  OpenStack  システムトラブルシュート 

第23回 ファミリー・ツリー 2013年5月

 2013年5月14日に、Oracle社主催の "Java Day Tokyo 2013" が行われました。
 筆者はあいにく参加が叶いませんでしたが、主題の一つはJava 8であったはずです。Java 8は前号で記載したLambda(ラムダ式)がメインフィーチャーされるとニュースが出ていました。来年初頭のリリースを期待して待つことにします。
 さて、現行リリースのJava 7に話を戻しまして、前回は、マルチコア対応機能Fork/Joinフレームワークをご紹介しました。
 今回は、ファイル操作機能 NIO.2, More New I/O APIsをご紹介します。

 Java 1.4で追加された最初のNIOは、バッファやチャンネルなどを中核にしたパフォーマンスに於ける問題を払拭するための機能強化でした。以降のリリースでも随時 I/O周辺の機能拡充が行われてきましたが、バージョン2と銘打ったNIO.2ではパフォーマンス改善に加え、今までJavaが不得手だったファイル操作を幅広く補完する大手術を行いました。既存の標準ライブラリに大鉈が振り下ろされ大幅に機能が増えたことでコーディングの記述が簡易になりました。
 それ故に、Java 7ではファイル/ディレクトリ操作のコードは従来の書き方と大きく様変わりすることになりました。

 Java 6以前では、主役となるのがFileクラスでした。
 Java 7からPathインターフェースに交代することになります。

 代役ではなく、Fileが降板してキャスト変更となる大きな変化です。
 しかも主役との絡みで Files, Pathsクラスという共演者も登場です。
 相手役には、FileSystemsクラス、そしてディレクトリの状態変化を察知できるWatchServiceインターフェースをストーリー(コード)にイベントとして組み込む(登録する)ことも可能になりました。
 またAttributeViewインターフェースを頂点にして、これまで扱えなかったファイルシステム固有のオーナーやアクセス権限などファイル属性情報を操作できるインターフェースを完備するに至る多様な脇役達がNIO.2にて補完されています。小ネタですが、Filesクラスにファイルをコピー(copy)と移動(move)するメソッドがついて、大変便利です。

 注目したのは、既出のディレクトリ監視 "WatchService APIs" ともう一つ「ファイルツリーの散策」"Walking the File Tree" が数ある新機能の中でも特に目を惹きます。

 このファイルツリーの散策は、指定したディレクトリツリー以下で再帰的にファイルアクセスする操作を一度に行える便利な代物です。
 利用方法は、まずFileVisitorインターフェースの実装をします。
 FileVisitorに4つのメソッド(ディレクトリを来訪する前後とファイル来訪及びファイル来訪時に例外発生の計4つのメソッド)が用意されています。
 このメソッドにファイル/ディレクトリが見つかった時にどのような挙動を取るのか?を実装します。
 実行には、FilesクラスのwalkFileTreeメソッドの引数として、開始ディレクトリを指定したPathと、前述のFileVisitorの実装クラスの2つを引数にセットするだけでツリー内の全てのファイルを走査する処理ができるのです。

 例えば、ディレクトリ以下に散在する拡張子が".jpg"のファイルを全て削除するなどといったこともwalkFileTreeを使えば簡単に記述できるようになります。

 上述のファイル探索にも新機能が用意されています。
 新登場のPathMatcherインターフェースがファイルのパターン検索を簡易に使えるようになっており、文字パターンの簡易指定可能な"glob"と正規表現の"regex"の2つの文法を指定できる細やかさです。

| FileSystem fs = FileSystems.getDefault();
| PathMatcher matcher = fs.getPathMatcher("glob:*.{.jpg}");

 PathMatcherにはmatchesメソッドが用意されることになるため、matchesの引数にPathを渡してあげればマッチするか否か判別してくれる(返り値は真偽値)という流れです。便利ですね。

| Path name = path.getFileName()
| if (matcher.matches(name) )

 ご存知のように、ファイルツリーを走査する類のプログラムを書くのは、これまでのJavaの標準機能ではとても苦手でしたが、Java 7からは標準ライブラリに工夫が施されて常備されたので簡易に書けるよう改善されたのです。

「ファミリー・ツリー」(The Descendants)はジョージ・クルーニーの主演映画です。日本人にも所縁の深いハワイで生活するある家族の話です。傍からではのんびりと見える楽園の地であっても生活の場として暮らしている人間の艱難辛苦は普遍であることを物語っています。
 ストーリーでは一つの悲劇というイベントが発生することで、親しいはずの家族の見知らぬ顔を見る羽目になります。主人公のジョージが内面で葛藤し不恰好に真正面に対峙していく様が繊細に描かれています。家族である二人の娘に正面から向き合うことで、原住民であった先祖代々から引き継がれた土地を子孫である彼が果たしてどうするのか?が問われます。その彼の選択と行動が彼の子孫である子供達の未来を選択していることになるのですから。

 ファミリー・ツリーとファイルツリー散策機能を知り、『ツリー』コマンドをJava 7で実装したいと思い付きました。
 UNIX/Windowsの"TREE"コマンドをJavaで擬態したい欲求です。単に音に反応しただけの安直な思いつきそのままですが、後日試してみたいと思います。
 挑戦した結果をお披露目するかもしれません。期待せずにお待ちください。

 では次回もお楽しみに。

 >> Javaの関連コース一覧

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  OpenStack  システムトラブルシュート