Я написал Java-приложение, которое обращается к файлу, в то время как другие процессы на других виртуальных машинах пытаются сделать то же самое. Поэтому я использую класс FileLock:
FileOutputStream fos = new FileOutputStream(filePath,append);
FileChannel f = fos.getChannel();
FileLock lock;
while ((lock = f.tryLock()) == null){
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);
}
}
OutputStreamWriter out = new OutputStreamWriter( new FileOutputStream(filePath,append));
out.write(textToWrite);
out.close();
lock.release();
Все отлично работает на Mac OSX, но когда я запускаю код в Windows 7, он выдает IOException в строке
out.close();
, при попытке смыть.
java.io.IOException: The process cannot access the file because another process has locked a portion of the file
at java.io.FileOutputStream.writeBytes(Native Method)
Насколько я понимаю из Как работает FileLock?, фактическое получение блокировки с
f.tryLock()
запрещает мне доступ к нему, так как другой процесс (по-видимому, этот) имеет эксклюзивную блокировку.
Теперь это кажется мне парадоксом - как я могу получить монопольную блокировку, чтобы позволить мне писать в файл без опасности того, что другие процессы возятся с ним, в то время как фактический акт получения блокировки мешает мне сделать это?
И, следовательно, почему это работает на Mac OS, а не на Windows? Из JavaDocs я знаю, что с классом FileLock есть различия и трудности, характерные для ОС, но, конечно же, не в отношении его предназначенной для него функциональности. Поскольку этого не может быть, я делаю что-то не так, и здесь я прошу вашей помощи.
Спасибо, М