2016年6月18日土曜日

Files.listにやられた→ディレクトリが消えない

Java7から追加されているjava.nio.file.Filesクラスは、Pathと並んで便利。

だが、ちょっと気持ち悪いAPIのせいで気持ち悪い現象に嵌った。

Tomcatからの操作でディレクトリをFiles.delete(path)で消すと、成功する。成功するのにディレクトリは消えていない。もう一度消すと失敗する。そりゃそうだ、さっき削除に成功しているのだから。

でも、ディレクトリは依然として存在している・・・なぜかタイムスタンプがなくなった状態で。

そして、Tomcatをシャットダウンするとディレクトリは消える。


・・・という現象。


何かをcloseし忘れてるのだろうとは思ったが、ファイルじゃなくてディレクトリだし、空だし・・・と悩んでしまった。

結局、Files.listで一覧を取得した際に帰ってくるStreamをcloseしていなかったから、ファイルのハンドルが閉じていなかったようだ。で、プロセスが消える時にそれが閉じるのでようやく本当に消えると。

でもさあ。

Files.list(path).filter(f->Files.isDirectory(f)).forEach(f->Files.delete(f));// これはダメ

とか書きたくなるじゃん。Streamで帰ってくるんだから。

JavaDocをよく見たら、

try(Stream<Path> = Files.list(path)){
  //do something
}catch(Exception e){

みたいにやれと書いてあったけど、なんかそんなら無理にStreamとかにしなくても良かったんじゃねえの、という気がする・・・。


なお、問題が起きてたのはWindows環境。Linuxだとどうなのかは確認してない。

0 件のコメント:

コメントを投稿