Вопрос-ответ

How can I lock a file using java (if possible)

Как я могу заблокировать файл с помощью java (если возможно)

У меня есть процесс Java, который открывает файл с помощью программы чтения файлов. Как я могу запретить другому процессу (Java) открывать этот файл или, по крайней мере, уведомить этот второй процесс о том, что файл уже открыт? Автоматически ли это приводит к тому, что второй процесс получает исключение, если файл открыт (что решает мою проблему), или я должен явно открыть его в первом процессе с каким-то флагом или аргументом?

Для уточнения:

У меня есть Java-приложение, которое выводит список папок и открывает каждый файл в списке для его обработки. Оно обрабатывает каждый файл один за другим. Обработка каждого файла состоит из его чтения и выполнения некоторых вычислений на основе содержимого, и это занимает около 2 минут. У меня также есть другое Java-приложение, которое делает то же самое, но вместо этого выполняет запись в файл. Я хочу иметь возможность запускать эти приложения одновременно, чтобы сценарий выглядел следующим образом. ReadApp выводит список папок и находит файлы A, B, C. Он открывает файл A и начинает чтение. WriteApp выводит список папок и находит файлы A, B, C. Он открывает файл A, видит, что он открыт (в виде исключения или любым другим способом) и переходит к файлу B. ReadApp завершает файл A и переходит к B. Он видит, что он открыт, и переходит на C. Крайне важно, чтобы WriteApp не выполнял запись, пока ReadApp читает тот же файл, или наоборот. Это разные процессы.

Переведено автоматически
Ответ 1

FileChannel.блокировка - это, вероятно, то, что вы хотите.

try (
FileInputStream in = new FileInputStream(file);
java.nio.channels.FileLock lock = in.getChannel().lock();
Reader reader = new InputStreamReader(in, charset)
) {
...
}

(Отказ от ответственности: код не компилировался и, конечно же, не тестировался.)

Обратите внимание на раздел, озаглавленный "зависимости платформы" в документе API для FileLock.

Ответ 2

Не используйте классы вjava.io пакете, вместо этого используйте java.nio пакет . У последнего есть FileLock класс. Вы можете применить блокировку к 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) {
}
Ответ 3

Если вы можете использовать Java NIO (JDK 1.4 или новее), то я думаю, вы ищете java.nio.channels.FileChannel.lock()

FileChannel.lock()

Ответ 4

используйте java.nio.channels.FileLock в сочетании с java.nio.channels.FileChannel

java