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