使用FileLock将行附加到文件

时间:2016-07-29 00:47:59

标签: java io locking nio

这是我在文件中附加行的最明显方法。 (如果文件不存在,则创建文件)

String message = "bla";
Files.write(
    Paths.get(".queue"),
    message.getBytes(),
    StandardOpenOption.CREATE,
    StandardOpenOption.APPEND);

但是,我需要在它周围添加(OS)锁定。我已经浏览了FileLock的示例,但是在Oracle Java教程中找不到任何规范示例,并且API对我来说非常难以理解。

3 个答案:

答案 0 :(得分:2)

不在此代码周围。您必须通过FileChannel打开文件,获取锁定,执行写入,关闭文件。或者释放锁定并保持文件打开,如果您愿意,所以您只需要下次锁定。请注意,文件锁只能保护您免受其他文件锁的攻击,而不是像您发布的代码那样。

答案 1 :(得分:2)

您可以锁定检索其流通道并锁定它的文件。

以下内容:

new FileOutputStream(".queue").getChannel().lock();

您也可以使用tryLock,具体取决于您希望的顺畅程度。

现在要编写并锁定,您的代码将如下所示:

try(final FileOutputStream fos = new FileOutputStream(".queue", true);
    final FileChannel chan = fos.getChannel()){
    chan.lock();
    chan.write(ByteBuffer.wrap(message.getBytes()));
}

请注意,在此示例中,我使用Files.newOutputStream添加了打开选项。

答案 2 :(得分:1)

您可以将锁定应用于FileChannel。

 try {
        // Get a file channel for the file
        File file = new File("filename");
        FileChannel channel = new RandomAccessFile(file, "rw").getChannel();

        // Use the file channel to create a lock on the file.
        // This method blocks until it can retrieve the lock.
        FileLock lock = channel.lock();

        /*
           use channel.lock OR channel.tryLock();
        */

        // Try acquiring the lock without blocking. This method returns
        // null or throws an exception if the file is already locked.
        try {
            lock = channel.tryLock();
        } catch (OverlappingFileLockException e) {
            // File is already locked in this thread or virtual machine
        }

        // Release the lock - if it is not null!
        if( lock != null ) {
            lock.release();
        }

        // Close the file
        channel.close();
    } catch (Exception e) {
    }

有关更多内容,您可以阅读本教程:

  1. How can I lock a file using java (if possible)
  2. Java FileLock for Reading and Writing