防止使用Nio删除锁定文件

问题描述

我们要防止其他进程删除正在运行的应用程序的temp目录。这样,我们将在其中创建一个临时目录和一个 lock 文件。我发现阻止删除文件的唯一方法是使用RandomAccessFile

tempDirectory = Files.createTempDirectory("myapp");
final Path lockFile = Files.createTempFile(tempDirectory,"lock",null);
randomAccessFile = new RandomAccessFile(lockFile.toFile(),"rw");

是否可以通过nio实现相同的目的?我尝试使用以下代码

import java.io.*;
import java.nio.channels.*;
import java.nio.file.*;

public class CreateLock {

    public static void main(String[] args) throws IOException,InterruptedException {
        final Path path = Paths.get("C:/temp/test");
        Files.createFile(path);
        final FileChannel channel = FileChannel.open(path,StandardOpenoption.WRITE);
        channel.lock();

        for (int i = 60; i-- > 0; ) {
            System.out.println(i);
            if (!Files.isRegularFile(path)) {
                System.out.println("File is gone");
                break;
            }

            Thread.sleep(10_000);
        }

        channel.close();
    }
}

但使用此代码的第二个Java应用程序

import java.io.*;
import java.nio.file.*;

public class DeleteLock {

    public static void main(String[] args) throws IOException {
        final Path path = Paths.get("C:/temp/test");
        Files.delete(path);
    }
}

可以删除文件

解决方法

请尝试以下操作:

FileChannel ch = FileChannel.open(lockFile.toAbsolutePath(),StandardOpenOption.WRITE);
ch.lock();

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...