2

ディレクトリからファイルを処理する Java スタンドアロン アプリケーションがあります。この Java アプリケーションは、1 分ごとに 1 回実行される cron ジョブによってトリガーされる AIX ボックスで実行されます。私の目的は、Java アプリケーションの 1 回の呼び出しがそのディレクトリ内の特定のファイルにアクセスする場合です。そのファイルは、最初の Java 呼び出しがファイルを処理してロックを解放するまで、2 回目または他の呼び出しによるアクセスのためにロックされます。

Java でファイルをプログラムでロックする方法はありますか?このコードは特に AIX で動作するはずです

4

3 に答える 3

0

cronを介して毎分プロセスを開始するのではなく、処理プロセスで1分間待機(スリープ)する方がよい場合があります。

アクセスするファイルを処理することが目的の場合は、処理の準備ができたときにファイルの名前を変更することでも同じことができます。Unixでは、OSの名前変更はアトミックです。

たとえば、データをファイルに書き込み、処理の準備ができたらspool-${timestamp}名前を変更します。処理プロセスは、追加のロックメカニズムを必要とせずに、ファイルが表示されるとすぐに処理および削除できるファイルをdata-${timestamp}待機します。data-${timestamp}

于 2013-01-02T10:18:40.423 に答える
0

NIO を使用してファイルをロックできます。

try
{
    RandomAccessFile file = new RandomAccessFile( "yourfile.txt" , "rw" );
    FileChannel fc = file.getChannel();
    FileLock fileLock = fc.tryLock();
    if ( fileLock != null )
    {
        // Do stuff on the file
    }
}
catch ( OverlappingFileLockException e )
{
    // File was locked
}

動作するはずです。

乾杯、

于 2013-01-02T10:11:23.263 に答える
0

これを行う標準的な方法はFileChannel、ファイルから out を作成し、それを呼び出す.lock()ことです。このメソッドは、必要なFileLockオブジェクトを作成します.release()

ロックを取得できない場合は、OverlappingFileLockException.

別の方法として、sentinel ディレクトリを使用してファイルを「ロック」することもできます。ファイルのパスを選択し、ディレクトリを作成し、必要なことをすべて行い、終了時にディレクトリを削除します。ディレクトリを作成できない場合は、別のプロセスが優勢であることを意味します。

どの方法を選択する場合でも、必ずロックを解除するか、finallyブロック内のディレクトリを削除してください。

于 2013-01-02T10:10:29.997 に答える