Проблема с механизмом захвата файла Java (FileLock и т.д.)

Я создаю простое приложение для открытия и редактирования 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), другие экземпляры приложения могут теперь получить доступ к отредактированному файлу.

Я нахожу это поведение странным. Кто-либо мог объяснить, почему это происходит?

Я надеюсь, что вышеупомянутое имеет смысл.Заранее спасибо!

5
задан KostasT 19 March 2010 в 17:14
поделиться

1 ответ

Из документа JavaDocs FileLock:

Действительно ли блокировка предотвращает доступ другой программы к содержимому заблокированной области, зависит от системы и поэтому не определено.

Ваша платформа обеспечивает только рекомендательную блокировку. Установление рекомендательной блокировки не помешает другим процессам получить доступ к файлу.

Таким образом, блокировка файла на самом деле просто вывешивает табличку «Не беспокоить», но оставляет дверь незапертой. Если все читают и уважают знак, вы в порядке, но это не мешает никому просто войти.

В JavaDocs также прямо говорится:

Блокировки файлов удерживаются от имени всей виртуальной машины Java. Они не подходят для управления доступом к файлу несколькими потоками в одной виртуальной машине.

Если ваш код выполняется на сервере приложений, блокировка файлов не сделает то, что вам нужно.

7
ответ дан 14 December 2019 в 08:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: