问题描述
我们要防止其他进程删除正在运行的应用程序的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();