2016-08-04 73 views
6

Javaアプリケーションからテキストファイルを読み込む必要があります。Javaでの同時読み込み/書き込みファイル

ファイルには多数の行が含まれています。このファイルは、ファイルに新しい行を追加する外部の不明なアプリケーションからX分ごとに更新されます。

ファイルからすべての行を読み込む必要があり、次に読み込んだすべてのレコードを削除する必要があります。

ファイルを行単位で読み込み、読み込んだ各行を削除すると同時に、外部アプリケーションがファイルに他の行を追加できるようにするのは可能でしょうか?

このファイルはSamba共有フォルダにありますので、ファイルとBufferedReader Javaクラスの読み書きにはjCIFSを使用しています。

+0

あなたのコントロール下にないアプリケーションによって書き込まれたファイルを変更することは悪い考えです。なぜあなたは削除する必要がありますか?ファイルを変更せずに、今までに読んだ行数のマーカーを維持するだけで十分でしょうか? – RealSkeptic

+0

これは 'Socket Writing'と' RESTful POST'コマンドが作られたことのようなものです。 –

+0

@RealSkeptic行を「既に処理済み」としてマークするのが最も簡単な方法だと思うので、今読んだ行を削除または更新する必要があります。行を処理した後、私はMySQLテーブルに格納する必要がありますので、ファイルに行を残す必要はありません。 –

答えて

1

問題は、私たちがどのように外部アプリケーションの書き込みを知っている、および/または、このファイルを再利用しないで、事前に

感謝。外部アプリケーションがカウンタを使用して正しく実行されている間に行を削除すると問題になる可能性があります...

他のアプリケーションの仕組みがわからない限り、良い解決策はありません。

私はあなたの問題の完全な解決策を知らないが、私は違っそれを解決するだろう
2

  • は、ファイル(タイムスタンプでそれに一意の名前を付け)
  • アペンダジョブの名前を変更しますその後、自動的に再作成
  • プロセスあなたのタイムスタンプのファイル(後で何が起こったかを確認することができますので、それらを削除する必要はありませんが、場所に保管してください)
+0

"アペンダージョブは自動的にそれを再作成します" - >わかりません。たとえば、起動時にのみ実行します。 – N0un

+0

@ N0unは確かではありませんが、真実ですが、価値があります。 –

+0

@SeanPatrickFloydクライアントが、プロダクション環境で非常に特定の方法でアプリケーションを実行することをクライアントが期待している場合を除きます。 –

0

ファイルを行単位で読み込み、読み込んだ各行を削除すると同時に、外部アプリケーションでファイルに他の行を追加できるようにすることは可能ですか?

はい、複数のプロセスから同じファイルを読み書きすることができます。たとえば、Linuxでは、同じファイルに対して2つの別々のファイル(file descriptors)が得られます。 PIPE_BUF, or 4096 bytes in Linux,のサイズでのファイル書き込みでは、操作がアトミックであると想定することは安全です。つまり、カーネルは競合状態を防ぐためにロックとロック解除を処理しています。

プロセスAがファイルへの書き込みをAPPENDとしてオープンしたと仮定すると、プロセスAはカーネルにwrite()を通知するたびに、ファイルのサイズ(ファイルの終わり)を探します。つまり、プロセスAからの書き込み操作がPIPE_BUFを超えない限り、プロセスBからファイル内のデータを安全に削除できることを意味します。Linuxでは、すなわち、プロセスAは書き込み操作をスパムすることがあり、プロセスBは常にデータの削除/書き込みを行うことができ、ファンキーな振る舞いは生じません。

Javaはimplemented File Locksを提供します。しかし、それは単に「勧告」であり、「必須」ではないことを理解することが重要です。 Javaでは制限が適用されません。両方のプロセスは、別のプロセスがロックを保持しているかどうかをチェックする必要があります。

+0

ロック? Linuxはそれを処理しますか?このアサーションを確認するドキュメントを表示できますか? – RealSkeptic

+0

@RealSkeptic Linus Torvaldから正式な投稿が見つかりません。しかし、あなたがグーグルであれば、書籍、ウェブサイト、オペレーティングシステムのコースで豊富な証拠を見つけることができます。 [これは一例です](http://www.cim.mcgill.ca/~franco/OpSys-304-427/lecture-notes/node27.html)。また、より多くの[stackoverflow support](http://stackoverflow.com/a/2751750/1241782)。 –

+0

* PIPE_BUFまたはLinuxで4096バイトのサイズのファイル書き込みの場合、操作がアトミックであると想定するのは安全です。つまり、カーネルが競合状態を防ぐためにロックとロック解除を処理していることを意味します。明らかにネットワーク接続を介して更新されている共有ファイルシステム。書き込まれているファイルから読み込むことは、ローカルファイル上の低レベルのCコードで確実に実行するのに十分です。ネットワークを介してJavaで*行い、書き込みプロセスと並行してファイルを変更することは、 。 –

関連する問題