2

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

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

请指导我解决我的问题。

谢谢

4

2 回答 2

2

Maybe this class can help you http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html

Edit: This post might already be covering the subject How can I lock a file using java (if possible)

Exemple:

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

Now in the reading process:

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();
}
于 2013-05-28T09:43:44.227 回答
2

您将在这里遇到的问题是 Java 不能open()使用O_EXCL,因此您不能原子地创建文件。

改用目录:创建目录是一个原子操作。如果无法创建目录,File's将返回 false。当你完成时。.mkdir()rmdir()

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

于 2013-05-28T09:44:05.977 回答