Как я могу заблокировать файл с помощью 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.блокировка - это, вероятно, то, что вы хотите.
Не используйте классы вjava.io пакете, вместо этого используйте java.nio пакет . У последнего есть FileLock класс. Вы можете применить блокировку к FileChannel.
try { // Get a file channel for the file Filefile=newFile("filename"); FileChannelchannel=newRandomAccessFile(file, "rw").getChannel();
// Use the file channel to create a lock on the file. // This method blocks until it can retrieve the lock. FileLocklock= 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()