9

私はそれが私に起こるとは思っていませんでしたが、Javaで最初のバグに遭遇しました:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5003595

私はバグ(Linux上のNFS)で説明されているのとほぼ同じ状況にあり、それFile.exists()が正しい値を返さないことがわかります(少なくともすぐには)。

だから私の質問は、ファイルが存在するかどうかをチェックするこの方法に代わるものはありますか?可能であれば、OSに依存しないようにしたいです。

編集:回避策を見つけました。を呼び出すとls $filedir、NFSはJavaの問題を引き起こしているキャッシュ/メタデータを更新しFile.exists()、正しい値を返します。確かに、これは移植性を損なうため、完全に理想的ではありませんが、その問題に対処する方法はあります。

4

6 に答える 6

7

NFS に関する基本的な問題は、属性、ファイル、およびディレクトリ情報がキャッシュされることです。これは、情報が古くなっている可能性があることを意味します。キャッシュをオフにできる場合がありますが、パフォーマンスが大幅に低下します。

覚えておくべき重要なことは、NFS はメッセージング サービスではなく、データをタイムリーに配信するようには設計されていないということです。

于 2010-09-30T20:06:42.120 に答える
6

File.exists()true が返された後、誰かがファイルを削除したり、NFS マウントがなくなったりして、ファイルを開こうとするとどうなりますか? File.exists()とにかくファイルを開くことから発生する可能性のある例外を処理する必要があるため、基本的には役に立ちません。

于 2010-09-30T17:24:59.903 に答える
5

File.existsファイルが過去のある時点で存在したかどうかがすべてわかります。それはあなたに教えてくれません:

  • 開こうとしたときに存在するかどうか
  • あなたがそれを開く許可を持っているかどうか
  • 本当に便利なものは何でも

したがって、事前にチェックせずに存在しないファイルを処理できるように、アプリケーションを設計してみてください。(実際にファイルを操作するときは、さまざまな例外を処理する必要があります。)

于 2010-09-30T17:22:48.270 に答える
3

ファイルが存在しない場合、またはファイルの存在を特定できないjava.nio.file.Path.exists()場合、Java 7 のメソッドが返されることに気付きました。したがって、偽陰性はしばらくの間存在し、コードでそれらを許容する必要があるように思われます。false

于 2010-09-30T18:35:03.167 に答える
2

明らかな代替手段はFile.isFile(). まずそれを試してください。

読み取り専用ファイルを読み取ると不正確になりますが、 を使用しFile.canWrite()てファイルが存在するかどうかを常に確認できます。

上記の両方が失敗した場合は、File.length(). 返され0Lた場合、ファイルが存在しないことがわかります。

于 2010-09-30T17:40:25.420 に答える