11

私たちの Java プログラムは、いくつかの重要なデータを継続的にファイルに書き込みます。ここで、(java プログラムが書き込んでいる) ファイルがユーザーによって手動で削除されるたびに、何らかの例外をスローするか、何らかのエラー メッセージをコンソールに表示したいと考えています。

削除されたファイルに書き込もうとしても、Java は例外をスローしないことがわかりました。

方法 I -ファイルが存在するかどうかをチェックし続ける新しいスレッドを開始し、ファイルが削除されたときにそのことをメインの Java プログラムに通知します。私たちの場合、Java プログラムが書き込むファイルがいくつかあるため、これは機能しません。すべてのファイルに対して新しいスレッドを開始すると、メモリ効率が低下します。

方法 II -ファイルに書き込む直前に毎回ファイルの存在を確認します。また、ファイルの存在を確認するのはコストのかかる操作であるため、これも適切な方法ではありません。

方法 III - java.io.FilterWriter (ファイルへの書き込みに使用) を拡張し、 write()メソッドをオーバーライドして、削除されたファイルに書き込みを試みるたびに例外をスローします。これは良い解決策のようですが、そのメソッドをオーバーライドすることでスローできる例外 (削除されたファイルに書き込もうとしたとき) を Java が消化している場所が見つかりませんでした。

4

4 に答える 4

1

Unixには、ファイルとディレクトリがあります。ファイルは必要な数のディレクトリに表示でき、開いているファイルはディスク上にある可能性がありますが、どのディレクトリにも表示されません。ファイルではなく、ディレクトリへの変更であるディレクトリからファイルが削除された場合。

ディレクトリが変更されたかどうかを判断するには、File.exists()を使用してそのパスをポーリングする必要があります。Java 7には、ポーリングの必要性を回避できるDirectoryWatcherがあります。

于 2011-06-23T07:37:06.393 に答える
1

この場合、 FileChannelクラスとFileLockクラスが役立ちます。

Javaを使用してファイルをロックする方法を参照してください(可能な場合)

于 2011-06-23T07:04:42.117 に答える
1

まず第一に、欠落しているファイルに書き込もうとしても、Java が例外をスローしないとは思えません。起こりうることは、UNIX ではファイルがユーザーによって削除されても、プロセスがバックアップ ファイル (独自のコピー) に書き込むことです。

Apache Commons io ファイル モニター パッケージを見てみましょう: http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/monitor/package-summary.html 基本的に、登録できます。さまざまなイベント (ファイルの削除、ディレクトリの削除など) のリスナーとリスナー。

削除を防止したい場合は、@splash のコメントを参照してください。別のオプションは、独自の一時ディレクトリにある隠しファイルに書き込むことです。

于 2011-06-23T09:10:55.170 に答える
-1
  1. Unix、Linux、Solaris、MacOS、HP/UX、AIX などでは、開いているファイルが削除されたことを検出する方法はありません。

  2. Windows では、開いているファイルを削除することはできません。

したがって、あなたの質問には明確な答えがありません。

于 2011-06-23T09:15:09.887 に答える