23

特定の移動関連コマンドが含まれているファイルを読み取るために、cronからかなり頻繁に呼び出されるプロセスがあります。私のプロセスは、このデータファイルの読み取りと書き込みを行う必要があります。また、この間、他のプロセスがこのデータファイルにアクセスしないように、プロセスをロックしたままにしておく必要があります。ユーザーは完全に別のプロセスを実行して、この同じデータファイルに(潜在的に)書き込み/追加することができます。これらの2つのプロセスを適切に実行し、一度に1つのファイルにのみアクセスするようにします。

nio FileLockは私が必要としていたもののようでした(自分のセマフォタイプのファイルを書くことはできませんでした)が、読み取るためにロックするのに問題があります。ロックと書き込みは問題なく実行できますが、読み取り時にロックを作成しようとすると、NonWritableChannelExceptionが発生します。読み取りのためにファイルをロックすることさえ可能ですか?RandomAccessFileは私が必要としているものに近いようですが、それを実装する方法がわかりません。

失敗するコードは次のとおりです。

FileInputStream fin = new FileInputStream(f);
FileLock fl = fin.getChannel().tryLock();
if(fl != null) 
{
  System.out.println("Locked File");
  BufferedReader in = new BufferedReader(new InputStreamReader(fin));
  System.out.println(in.readLine());
          ...

例外はFileLock行でスローされます。

java.nio.channels.NonWritableChannelException
 at sun.nio.ch.FileChannelImpl.tryLock(Unknown Source)
 at java.nio.channels.FileChannel.tryLock(Unknown Source)
 at Mover.run(Mover.java:74)
 at java.lang.Thread.run(Unknown Source)

JavaDocsを見ると、

元々書き込み用に開かれていなかったチャネルに書き込もうとしたときにスローされるチェックされていない例外。

しかし、私は必ずしもそれに書き込む必要はありません。書き込み目的でFileOutpuStreamなどを作成しようとすると、同じファイルでFileInputStreamを開こうとするまでは問題ありません。

4

3 に答える 3

20
  1. ファイルをロックしても、他のプロセスがロックを使用しない限り、そのファイルにアクセスできないことをご存知ですか?
  2. 書き込み可能なチャネルを介してロックする必要があります。「rw」モードでを介してロックを取得し、RandomAccessFileを開きますFileInputStream。必ず両方閉じてください!
于 2010-02-15T21:46:40.437 に答える
13

を使用してロックを作成した方がよいでしょうtryLock(0L, Long.MAX_VALUE, true)

これにより、読み取りのために行うべき正しいことである共有ロックが作成されます。

tryLock()は の省略形ですtryLock(0L, Long.MAX_VALUE, false)。つまり、排他的な書き込みロックを要求します。

于 2010-05-29T12:38:02.540 に答える