我有一个 java 独立应用程序,它将处理目录中的文件。这个 java 应用程序在 AIX 框中运行,由一个每 1 分钟运行一次的 cron 作业触发。我的目标是如果调用 java 应用程序访问该目录中的特定文件,该文件应该被锁定以供第二次或其他调用访问,直到第一个 java 调用处理它并释放锁定。
java中有没有办法以编程方式锁定文件?这段代码应该特别适用于AIX
我有一个 java 独立应用程序,它将处理目录中的文件。这个 java 应用程序在 AIX 框中运行,由一个每 1 分钟运行一次的 cron 作业触发。我的目标是如果调用 java 应用程序访问该目录中的特定文件,该文件应该被锁定以供第二次或其他调用访问,直到第一个 java 调用处理它并释放锁定。
java中有没有办法以编程方式锁定文件?这段代码应该特别适用于AIX
执行此操作的标准方法是从您的文件中创建一个FileChannel
并调用.lock()
它。此方法将创建一个FileLock
您必须创建的对象.release()
。
如果您无法获得锁,您将获得一个OverlappingFileLockException
.
或者,您可以使用哨兵目录“锁定”文件:为其选择路径,创建目录,执行您需要执行的任何操作,然后在退出时删除目录。如果您无法创建目录,则意味着另一个进程占了上风。
无论您选择哪种方法,请务必释放锁定或删除finally
块中的目录!
您可以使用 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
}
应该管用。
干杯,
与其每分钟通过 cron 启动一个进程,不如在处理过程中等待(休眠)一分钟。
如果您的目标是处理您访问的文件,您也可以通过在准备好处理文件时重命名文件来实现相同的目的。在 Unix 操作系统中,重命名是原子的。
例如,您将数据写入文件spool-${timestamp}
并将其重命名data-${timestamp}
为准备好处理时。处理过程等待data-${timestamp}
文件一出现就可以处理和删除,而无需额外的锁定机制。