用于基于文件的进程通信的Java文件锁定机制

时间:2013-05-28 09:40:08

标签: java linux locking

我有两个java进程(JAR),一个是每1分钟写一个文本文件,另一个是读取该文件并调用Web服务将数据存储在数据库中。

当文件处于写入模式时,有没有办法锁定文件?我观察到当wvdial拨打调制解调器时,我想在/var/lock/ttyUSB0..LOCK中创建一个锁文件。我希望这种程序如果文件处于写入模式,另一个进程可以等到写完成。编写完成后,可以读取文件内容。

请指导我解决我的问题。

谢谢

2 个答案:

答案 0 :(得分:2)

也许这门课可以帮助你http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html

修改:此帖子可能已涵盖主题How can I lock a file using java (if possible)

例:

FileInputStream in = new FileInputStream(file);
try
{
    java.nio.channels.FileLock lock = in.getChannel().lock();
    try
    {
        //write
    }
    finally
    {
        lock.release();
    }
}
finally 
{
    in.close();
}

现在正在阅读过程中:

FileInputStream in = new FileInputStream(file);
try
{
    FileLock lock = in.getChannel().tryLock();
    if (lock == null)
    {
        //file is locked, wait or do something else
    }
    else
    {
        try
        {
            //read
        }
        finally
        {
            lock.release();
        }
    }
}
finally 
{
    in.close();
}

答案 1 :(得分:2)

您将遇到的问题是Java无法open()使用O_EXCL,因此您无法以原子方式创建文件。

改为使用目录:创建目录是一种原子操作。如果无法创建目录,File的{​​{1}}将返回false。当你完成时.mkdir()

当然,请确保您的两个进程都具有对基本目录的写访问权限!