2017-01-05 19 views
1

クライアントからファイルをダウンロードして特定の場所に移動するjavaサーブレットを作成しています。移動後、ダウンロードしたファイルを削除します。時々linuxは.fuse_hidden ______という名前のファイルを作成します。サーバープロセスを再開するまで、それらはそこにとどまります。ダウンロード後、開いているすべてのストリームを閉じます。通常、マウントされたUSBフラッシュドライブで発生します。ここで削除しようとするとテンポラリファイルがlinuxに残ります

は私のコードスニペットは、ファイル上の少なくとも一つのオープンファイルハンドルがまだ存在することを意味

try{ 
      ... 
      inputStream = new RandomAccessFile(new File(sourcePath), "r"); 
      inputChannel = inputStream.getChannel(); 
      .... 
     } 
    finally{ 
      inputChannel.close(); 
      inputStream .close(); 
     } 
    new File(sourcePath).delete(); 
+0

例外はありますか?例外がスローされた場合、その文はtry、catch、finallyブロックの外にあるため、ファイルは削除されません。 – Michael

答えて

1

です。最後のハンドルが閉じられると、隠しファイルが削除されます。

あなたはあなたがあなたのサーバーを殺すと消えると言います。そのため、あなたのサーバーは依然としてそのファイルに対して少なくとも1つのハンドルを開いています。 lsofコマンドを使用して、実際に開いているハンドルを持つサーバーであることを証明できます。

正常終了と例外の両方のケースで、開いているすべてのストリームをJavaのファイルにクローズしていることを確認してください。

+0

ダウンロードコードを見て、ダウンロードしたファイルを閉じるために次の行があります。 destinationOutputStream.close(); \t \t \t \t destinationOutputStream.flush(); これがヒューズファイルの理由である可能性がありますが、close()の後にflush()が呼び出されていますか? –

+0

閉鎖されたストリームはフラッシュできませんので、コードは問題になります。この論理エラーを修正した後は、元のハンドルの問題は解消されますか? –

+0

遅く返事を申し訳ありません。修正が問題を解決したようです。テストの数時間後にそれらの.fuseファイルを見たことがありません。ありがとう! –

関連する問題