10

Java ファイルのロック メカニズムは、ロックの最初のルールであるロックの呼び出しをブロックすることができないため、本当の間違いであることがわかりました。私が間違っていない限り、アプリケーションが既にファイルのロックを維持している場合、lock() を呼び出すと例外がスローされます。ここでいくつかの回答を見てきましたが、残念ながらJava 7を使用していません。

ループに陥ることなく、排他的なファイルロックを待機する方法について誰か提案がありますかwhile(true):)

オービンの答えの後に編集(コメントからコピー):

私がしたいのは、ディレクトリにコピーされた後に大きなファイルにアクセスしてから処理することです。私のコードは単純です...

public boolean ifFileReady(File file) {
   boolean ready = false;
   FileLock lock = null;
   FileChannel channel = null;
   try {

      channel = new RandomAccessFile(file, "rw").getChannel();
      lock = channel.lock();
      lock.release();
      ready = true;
   }
   catch( IOException e ) {
      // Always Here
   }
   finally
   {
      if (channel != null)
         channel.close();
   }
   return ready;
}

ロックでブロックすることはありません。いつも投げる

4

2 に答える 2

3

次のコードは、ロックが例外をスローせずに実際にブロックされることを示しています。私は同様の問題を抱えていましたが、ユーザーがそうする権限を持っていないときにファイル rw を開くことによって実際に例外が発生したことを発見しました。

これは完全なプログラムです。デモンストレーションのために 2 つのインスタンスを同時に実行する

import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;

public class Test {
  public static void main(String args[]) throws Exception {
    FileChannel channel = null;
    File lockFile = new File("lock");
    System.out.println ("Opening file...");
    channel = new RandomAccessFile(lockFile, "rw").getChannel();
    System.out.println ("File open. Locking channel...");
    channel.lock();
    System.out.println ("Channel locked. Sleep for 30 seconds");
    Thread.sleep (30000);
    System.out.println ("Process terminating");
    }
}

コードをより簡潔にするために、ロック解除、クローズ、または例外処理を含めませんでした (コンパイラの警告が表示されます)。プロセスが終了すると、すべてのリソースが OS によって自動的に解放されます。

于 2015-03-11T16:54:49.393 に答える