Я создаю простое приложение для открытия и редактирования XML-файлов.Эти файлы находятся в локальной папке, доступ к которой осуществляется несколькими экземплярами приложения.Я хочу заблокировать каждый файл, который открывается экземпляром приложения, чтобы другие экземпляры не могли получить к нему доступ.
Для этого я использую следующий код:
function voidreadFile () {
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");
}
}
Поскольку я хочу сохранить блокировку редактируемого файла на время, я не закрываю raf и не освобождаю fl.
На этом этапе любой другой экземпляр приложения, который пытается получить доступ к заблокированному файлу, не может этого сделать.Пока все хорошо.
Я заметил следующую странную вещь:
Если после получения блокировки файла я открываю FileInputStream для того же файла, даже если объект FileLock остается действительным(isValid возвращает true), другие экземпляры приложения теперь могут получить доступ к редактируемому файлу.
Я считаю это поведение странным.Кто-нибудь может объяснить, почему это происходит?
Надеюсь, вышесказанное имеет смысл.Заранее спасибо!