Использование java FileChannel FileLock, чтобы предотвратить запись файла, но разрешить чтение

Я думаю, что неправильно понимаю, как работают функции блокировки FileChannel.

Я хочу иметь эксклюзивную блокировку записи в файл, но разрешить чтение из любого процесса.

На компьютере с Windows 7 под управлением Java 7 я могу заставить блокировку FileChannel работать, но она предотвращает как чтение, так и запись из других процессов.

Как я могу добиться блокировки файла, которая запрещает запись, но позволяет чтение другими процессами?

1 ответ

  • FileChannel.lock() имеет дело с областями файла, а не с самим файлом.
  • Замок может быть общим (много читателей, без писателей) или эксклюзивным (один писатель и без читателей).

Я предполагаю, что вы ищете немного другую функцию - открыть файл для записи, позволяя другим процессам открывать его для чтения, но не для записи.

Этого можно добиться с помощью API Java 7 FileChannel.open с нестандартной опцией открытия:

import static java.nio.file.StandardOpenOption.*;
import static com.sun.nio.file.ExtendedOpenOption.*;
...
Path path = FileSystems.getDefault().getPath("noshared.tmp");
FileChannel fc = FileChannel.open(path, CREATE, WRITE, NOSHARE_WRITE);

Заметка ExtendedOpenOption.NOSHARE_WRITE которая является нестандартной опцией, существующей в Oracle JDK.

Другие вопросы по тегам