読み書き用のJava FileLock
-
20-09-2019 - |
質問
私はそれに一定の動きに関連するコマンドを持つファイルを読むために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)
のJavaDocを見てみると、それは
と言います試みは最初は書き込みのために開かれていなかったチャネルに対して書き込みを行った場合、未確認の例外がスローされました。
しかし、私は必ずしもそれに記述する必要はありません。私は書き込みのためになど、FileOutpuStreamの作成をしようとすると私は同じファイル上のFileInputStreamを開こうとするまでは幸せです。
解決
(a)のファイルをロックすると、彼らはまた、ロックを使用しない限り、それに触れるから、他のプロセスを維持しないであろうことを知っている?
(B)あなたは、書き込み可能なチャネルを介してロックすることがあります。 「RW」モードでRandomAccessFile
を経由して、ロックを取得してからFileInputStream
を開きます。両方を閉じていることを確認してください!
他のヒント
あなたはtryLock(0L, Long.MAX_VALUE, true)
を使用してロックを作成した場合、それが良いだろう。
これは、読み取りのために行うには正しいことである共有ロックを作成します。
tryLock()
、すなわち、それは排他的な書き込みロックを要求し、tryLock(0L, Long.MAX_VALUE, false)
の省略形である。