特定の移動関連コマンドが含まれているファイルを読み取るために、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を開こうとするまでは問題ありません。