Я создаю простое приложение для открытия и редактирования XML-файлов. Эти файлы расположены в локальной папке, к которой получают доступ несколько экземпляров приложения. То, что я хочу сделать, заблокировать каждый файл, который открыт экземпляром приложения, так, чтобы другие экземпляры не могли получить доступ к нему.
Для достижения этого, я использую следующий код:
функционируйте освобождают readFile () {
File xmlFile = new File("myFile.xml");
RandomAccessFile raf = new RandomAccessFile(xmlFile, "rw");
FileLock fl = raf.getChannel().tryLock();
if(fl==null){
System.out.println("file already locked by another instance");
}else{
setCurrentFile(raf);
setLock(fl);
System.out.println("file successfully locked by this instance");
}
}
Так как я хочу сохранить блокировку на файле отредактированной в течение какого-то времени, я не закрываю Королевские ВВС, ни выпускаю fl.
В этой точке любой другой экземпляр приложения, которое пытается получить доступ к заблокированным сбоям файла, чтобы сделать так.Пока все хорошо.
Я наблюдал следующую странную вещь:
Если после получения блокировки на файле, я открываю FileInputStream на том же файле, даже при том, что объект FileLock остается допустимым (isValid, возвращает true), другие экземпляры приложения могут теперь получить доступ к отредактированному файлу.
Я нахожу это поведение странным. Кто-либо мог объяснить, почему это происходит?
Я надеюсь, что вышеупомянутое имеет смысл.Заранее спасибо!
Из документа JavaDocs FileLock:
Действительно ли блокировка предотвращает доступ другой программы к содержимому заблокированной области, зависит от системы и поэтому не определено.
Ваша платформа обеспечивает только рекомендательную блокировку. Установление рекомендательной блокировки не помешает другим процессам получить доступ к файлу.
Таким образом, блокировка файла на самом деле просто вывешивает табличку «Не беспокоить», но оставляет дверь незапертой. Если все читают и уважают знак, вы в порядке, но это не мешает никому просто войти.
В JavaDocs также прямо говорится:
Блокировки файлов удерживаются от имени всей виртуальной машины Java. Они не подходят для управления доступом к файлу несколькими потоками в одной виртуальной машине.
Если ваш код выполняется на сервере приложений, блокировка файлов не сделает то, что вам нужно.