12

着信 XML ファイルのフォルダーを監視する Java アプリケーションがあります。新しいファイルが検出されたら、ファイルが現在更新されておらず、閉じられていることをテストする必要があります。私の考えは、これをテストするためにFile.canWrite()を使用することです。これを行うことに問題はありますか?これは、ファイルが完全に書き込まれたことをテストする良い方法ですか?

私が投げかけている他のアイデアは次のとおりです。

  • 着信 XML ファイルを解析し、終了タグがあることをテストします。
  • EoF 文字を確認します。

これらの方法のいずれかがすべてのシナリオを処理できるかどうかはわかりません。

4

5 に答える 5

14

いいえ、canWrite はこの目的には適していません。通常、別のプロセスが書き込み中であっても、ファイルは書き込み可能です。

ロックを調整するには、より高いレベルのプロトコルが必要です。このコードを単一のプラットフォームで使用する場合は、 NIO の FileLock 機能を使用できる場合があります。ただし、ドキュメンテーションを注意深く読んでください。多くのプラットフォームでは、ロックは単なるアドバイスであることに注意してください。

もう 1 つの方法は、プロセスが認識できない名前で 1 つのプロセスにファイルを書き込み、書き込みが完了したときにファイルの名前を認識可能な名前に変更することです。ほとんどのプラットフォームでは、ソースとデスティネーションが同じファイル システム ボリュームである場合、名前変更操作はアトミックです。名前の変更では、別のファイル拡張子が使用される場合や、ファイルをあるディレクトリから別のディレクトリ (同じボリューム上) に移動する場合もあります。

この場合、XML のみを扱っているため、終了タグを探すことはできますが、絶対確実というわけではありません。最終的なマークアップの後にコメントがある場合、またはライターが有効な XML を記述していない場合はどうなるでしょうか?

EOF を探すことはできません。ライターがファイルを開いたばかりで、まだ何も書き込んでいない場合でも、常に EOF が発生します。そうでない場合、最も簡単な方法は、ファイルが表示されるとすぐにリーダーが解析を開始できるようにすることです。ライターがファイルを閉じるまで、単純にブロックされます。しかし、ファイルシステムはこのようには機能しません。何らかのプロセスが現在ファイルを移動している場合でも、すべてのファイルには終わりがあります。

于 2008-09-23T17:04:14.267 に答える
4

さらに、チェックの後に書き込みを行うと、競合状態になります。状態は、チェックと書き込みの間で変化する可能性があります。場合によっては、やりたいことを試して実行し、エラーを適切に処理するのが最善の方法です。おそらく、フォールバック遅延時間が増加した n 回の再試行メカニズムです。

または、テストを再定義します。この場合、処理する前にファイルサイズが一定期間変更されていないことをテストできます。

もう 1 つのオプションは、コードを 2 つに分割することです。別のスレッド (おそらくクォーツ タスク) を作成して、完成したファイルをメイン コードが処理する別のディレクトリに移動することもできます。

于 2008-09-23T17:13:15.787 に答える
2

Windowsで機能するように見えることの1つは、これです-問題のファイルを表すFile()オブジェクトを作成します(完全なファイル名のコンストラクターを使用)-同じ方法で2番目の同一のファイルオブジェクトを作成します。- firstFile.renameTo(secondFile) を試す

このダミーの名前変更の演習は、別のアプリで編集用に開いていないファイルでは成功するようですが (Word でテストしました)、開いている場合は失敗します。

そして、nw filename = 古いファイル名であるため、他の作業は作成されません。

于 2009-09-30T13:47:44.377 に答える
1

私の知る限り、別のプロセスが現在 Java からファイルへのハンドルを開いているかどうかを確認する方法はありません。1 つのオプションは、新しい ioのFileLockクラスを使用することです。これはすべてのプラットフォームでサポートされているわけではありませんが、ファイルがローカルにあり、ファイルを書き込むプロセスが連携している場合、これはロックをサポートするすべてのプラットフォームで機能するはずです。

于 2008-09-23T17:04:15.607 に答える
0

リーダーとライターの両方を制御する場合、可能性のあるロック手法は、ロックディレクトリを作成することです。これは通常、読み取りと書き込みのプロセス期間中のアトミック操作です。このタイプのアプローチを採用する場合、「ハング」したロック ディレクトリにつながるプロセスの潜在的な障害を管理する必要があります。

Cheekysoft が述べたように、ファイルはアトミックではなく、ロックには適していません。

ライターを制御しない場合 (たとえば、ライターが FTP デーモンによって生成されている場合) は、リネーム テクニックまたはタイム スパン テクニックの遅延が最適なオプションです。

于 2008-09-23T17:52:13.713 に答える