2

我有一个 java 独立应用程序,它将处理目录中的文件。这个 java 应用程序在 AIX 框中运行,由一个每 1 分钟运行一次的 cron 作业触发。我的目标是如果调用 java 应用程序访问该目录中的特定文件,该文件应该被锁定以供第二次或其他调用访问,直到第一个 java 调用处理它并释放锁定。

java中有没有办法以编程方式锁定文件?这段代码应该特别适用于AIX

4

3 回答 3

0

执行此操作的标准方法是从您的文件中创建一个FileChannel并调用.lock()它。此方法将创建一个FileLock您必须创建的对象.release()

如果您无法获得锁,您将获得一个OverlappingFileLockException.

或者,您可以使用哨兵目录“锁定”文件:为其选择路径,创建目录,执行您需要执行的任何操作,然后在退出时删除目录。如果您无法创建目录,则意味着另一个进程占了上风。

无论您选择哪种方法,请务必释放锁定或删除finally块中的目录!

于 2013-01-02T10:10:29.997 回答
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

与其每分钟通过 cron 启动一个进程,不如在处理过程中等待(休眠)一分钟。

如果您的目标是处理您访问的文件,您也可以通过在准备好处理文件时重命名文件来实现相同的目的。在 Unix 操作系统中,重命名是原子的。

例如,您将数据写入文件spool-${timestamp}并将其重命名data-${timestamp}为准备好处理时。处理过程等待data-${timestamp}文件一出现就可以处理和删除,而无需额外的锁定机制。

于 2013-01-02T10:18:40.423 回答