java来锁定文件

时间:2013-01-02 10:05:57

标签: java java-ee

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

java中是否有以编程方式锁定文件的方法?此代码应该在AIX中工作

3 个答案:

答案 0 :(得分:0)

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

如果您无法获得锁定,则会获得OverlappingFileLockException

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

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

答案 1 :(得分:0)

你可以lock files using 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
}

应该有用。

干杯,

答案 2 :(得分:0)

不是每分钟都通过cron启动一个进程,最好在处理过程中等待(休眠)一分钟。

如果您的目标是处理您访问的文件,您也可以在准备好处理文件时重命名该文件。在Unix中,os-ses重命名是原子的。

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