Я заметил, что java.io
и java.nio
реализация файлов произвольного доступа несколько отличается от того, как обрабатываются FileLocks
.Файл произвольного доступа FileLock: java.io vs. java.nio
Кажется, что (в Windows) java.io
предоставляет обязательную блокировку файла, а java.nio
предоставляет вам блокировку консультативного файла при запросе его соответственно. Обязательная блокировка файлов означает, что блокировка выполняется для всех процессов и содержит рекомендации для процессов велляции, которые следуют одному протоколу блокировки.
Если я запустил следующий пример, я могу удалить файл *.nio
вручную, а файл *.io
отказывается быть удаленным.
import java.io.*;
import java.lang.management.ManagementFactory;
import java.nio.*;
import java.nio.channels.*;
import java.nio.file.*;
public class NioIoLock {
public static void main(String[] args) throws IOException, InterruptedException {
String workDir = System.getProperty("user.dir");
FileChannel channelIo, channelNio;
FileLock lockIo, lockNio;
// use io
{
String fileName = workDir
+ File.separator
+ ManagementFactory.getRuntimeMXBean().getName()
+ ".io";
File lockFile = new File(fileName);
lockFile.deleteOnExit();
RandomAccessFile file = new RandomAccessFile(lockFile, "rw");
channelIo = file.getChannel();
lockIo = channelIo.tryLock();
if (lockIo != null) {
channelIo.write(ByteBuffer.wrap("foobar".getBytes("UTF-8")));
}
}
// use nio
{
Path workDirPath = Paths.get(workDir);
Path file = workDirPath.resolve(
Paths.get(ManagementFactory.getRuntimeMXBean().getName() + ".nio"));
// open/create test file
channelNio = FileChannel.open(
file, StandardOpenOption.READ, StandardOpenOption.WRITE,
StandardOpenOption.CREATE, StandardOpenOption.DELETE_ON_CLOSE);
// lock file
lockNio = channelNio.tryLock();
if (lockNio != null) {
channelNio.write(ByteBuffer.wrap("foobar".getBytes("UTF-8")));
}
}
// do not release locks for some time
Thread.sleep(10000);
// release io lock and channel
if (lockIo != null && lockIo.isValid()) {
lockIo.release();
}
channelIo.close();
// release nio lock and channel
if (lockNio != null && lockNio.isValid()) {
lockNio.release();
}
channelNio.close();
}
}
Есть ли причина для этого? Являются ли эти два даже альтернативными вариантами или они предназначены для сосуществования бесконечно?
Будет ли добавление 'SYNC, DSYNC' в версию nio изменить ситуацию? Тогда это было бы рассмотрением производительности. –
добавление 'SYNC, DSYNC' не имеет значения – starikoff