【问题标题】:java to lock filejava锁定文件
【发布时间】:2013-01-02 18:18:40
【问题描述】:

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

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

【问题讨论】:

标签: java jakarta-ee


【解决方案1】:

你可以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】:

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

    如果你无法获得锁,你会得到一个OverlappingFileLockException

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-01-15
        • 2015-10-18
        • 2014-12-10
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多