Java SE7 Gold 取得を目指して (12)


Java SE7 Gold をとりたい…!

本日は第12回目です。
Java7で大きく変わったNIO.2の後編です。

今日のこぼれ話

NIOを勉強していて知ったのですが、Paths/Path のように複数形のクラス名がファクトリ、というのが慣習のようです。

  • FileSystems → FileSystem
  • Paths → Path
  • Files → File

これに限らずUtil系のクラスも複数形ですね。

  • Arrays
  • Collections

ちょっとしたことですが、クラスの命名の際に役立つかもしれせん。
ところでNIO.2って何て読むのでしょう? えぬあいおーつー?

本日知ったこと(9章 2/2)

  • ディレクトリアクセス

    • ルートディレクトリの取得 fs.getRootDirectories()
    • 戻り値はItaratorで複数のドライブがあるような場合でも取得できる
    • ディレクトリ内の中身リスト取得 Files.newDirectoryStream()
    • 戻り値はItaratorでファイルやディレクトリのPathが入っている
  • ファイルツリー探索

    • Files.walkFileTree()
    • FileVisitorオブジェクトにコールバックを登録して、walkFileTree()に渡す
    • SimpleFileVisitorがAPIで提供されている
    メソッド 概要
    FileVisitResult preVisitDirectory(T dir, BasicFileAtttributes attr) エントリへのアクセス前行う操作
    FileVisitResult visitFile(T file, BasicFileAttributes attr) ファイルに対して行う操作
    FileVisitResult visitFileFailed(T file, IOException ex) ファイルにアクセスできない場合の操作
    FileVisitResult postVisitDirectory(T dir, IOException ex) ディレクトリ内のすべてのエントリへのアクセス後に呼ばれる
    エラーが発生している場合は例外が渡される
  • ファイル探索

    • fs.getPathMatcher()
    • 引数に regex:{regex pattern} or glog:{glob pattern}を渡す
    • globは *.java とかできる コマンドでよく見る形式
    • matcher.matches(fileName)で比較
    • newDirectoryStream(dir, "{glob pattern}")でフィルタリング結果を得られる
  • ディレクトリ監視

    • WatchServiceインタフェースを使用
    • Pathインタフェースの register(WatchService ws, WatchEvent.Kind<?>... events)で登録
     FileSystem fs = FileSystems.getDefault();
     WatchService ws = fs.newWatchService();
     path1.register(ws, StandardWatchEventKinds.ENTRY_CREATE); // ファイル作成を監
     WatchKey key = ws.take(); // 待機
     for(WatchEvent<?> event : key.pollEvents()) { // 発生したイベントの取り出し
       EatchEvent.Kind<?> kind = event.kind();
       System.out.print(kind.name()); // イベント名取得
     }
    

すべてにFileSystemインタフェースが絡んでいますね。ファイル関連の操作をしたくなったら、ひとまずFileSystemをあたってみるのがよさそうです。