WatchServiceが正しいPathを返してくれない
結論から言うと使い方が間違ってたわけなんですけれど。
Java7で導入されたjava.nio.file.Pathのregisterメソッドを使用する事でファイル更新を監視できるようになりました。
webで検索してみると、大体変更のあったファイル名を出力するようなサンプルがヒットします。こんな感じのプログラムでしょうか。
1: WatchService watchService = FileSystems.getDefault().newWatchService();
2: Path dir = ...;
3: dir.register(watchService,
4: StandardWatchEventKinds.ENTRY_CREATE,
5: StandardWatchEventKinds.ENTRY_MODIFY,
6: StandardWatchEventKinds.ENTRY_DELETE);
7: while (true) {
8: WatchKey key = watchService.take();
9: for (WatchEvent<?> watchEvent : key.pollEvents()) {
10: WatchEvent<Path> ev = (WatchEvent<Path>) watchEvent;
11: Path file = ev.context();
12: System.out.println(file);
13: }
14: }
ディレクトリdir
のファイルが追加/更新/削除した場合に、その変更があったファイルのファイル名を出力しています。
このプログラムを見て、file
っていうのは変更がファイルを示すものなんだろうな、と思い込んでプログラムを組んだのですが、得られたfile
を操作しようとしてもファイルが無いと、言われてしまいます(もちろん削除以外の操作で、です)。
これは何かおかしいぞ、と思いPath#toAbsolutePath()
でフルパスを得て出力してみたところ、パスが確かにおかしい。
さらに検索してみたところ、OracleのThe Java Tutorialsページにそのまんまの解説がありました。
上記のコード中のfileは、ファイル名のみの情報を持つ(パスの情報は持たない)ため、パスを含めた正しいファイル情報を得たいのであればresolve
メソッドで監視対象としたディレクトリのパスを加えてあげないといけないようです。
« いんきゅばす(旧:さきゅばすのNicoBrowser拡張)1.7.2 過去ログ取得機能/「コメントの量を減らす」機能 | トップページ | NetBeansから実行するとNimbusのJTable中に表示させたJProgressBarに文字列が表示されない »
コメント
この記事へのコメントは終了しました。
« いんきゅばす(旧:さきゅばすのNicoBrowser拡張)1.7.2 過去ログ取得機能/「コメントの量を減らす」機能 | トップページ | NetBeansから実行するとNimbusのJTable中に表示させたJProgressBarに文字列が表示されない »
whileの最後に、key.resetを付けていただけると幸いです。
http://docs.oracle.com/javase/jp/7/api/java/nio/file/WatchKey.html
投稿: | 2015/06/28 16:08