Как использовать FileLock на Android?

Я думаю, что мы можем заблокировать файлы для эксклюзивного доступа, поскольку я видел эту ссылку: http://developer.android.com/reference/java/nio/channels/FileLock.html

Я хочу создать файл сохранения/загрузки как в фоновом процессе (службе), так и в реальном приложении переднего плана. Они могут одновременно попытаться получить доступ к этому файлу, в этом случае следует подождать.

Я не смог найти реальный образец для FileLock на Android, я только что прочитал много тем, что это невозможно на Android. Но если да, то почему в документации есть раздел «FileLock»?


person frankish    schedule 28.02.2013    source источник


Ответы (4)


Это работает в обычном приложении Java:

File file = ...;
FileInputStream fis = new FileInputStream(file); // or FileOutputStream fos = new FileOutputStream(file);
FileLock lock = fis.getChannel().lock(); // or FileLock lock = fos.getChannel().lock();

// do whatever you want with the file

lock.release();
person Eng.Fouad    schedule 28.02.2013
comment
Могу ли я смешивать FileOutputStream и FileInputStream? оба вернут один и тот же номер канала? - person frankish; 28.02.2013
comment
Так что это будет работать между процессами, верно? (Я имею в виду, что 2 отдельных процесса будут ждать друг друга) - person frankish; 28.02.2013
comment
@frankish Попробуйте lock.isShared(). - person Eng.Fouad; 28.02.2013
comment
На Android 21 getChannel() возвращает FileChannel только для записи, который разделяет свою позицию с этим потоком. Так что нет возможности заблокировать при чтении. Вы получите исключение, если попытаетесь это сделать: FileInputStream fis = getActivity().openFileInput(fname); Блокировка FileLock = fis.getChannel().lock(); // исключение здесь - person Deepscorn; 16.04.2015

  1. Вы можете попробовать lock() с блокировкой и trylock() без блокировки
  2. FileLock не работает на FileInputStream.
  3. В Android FileLock работает между процессами, но не работает между потоками в процессе.
person kevinems    schedule 04.10.2013
comment
Что на самом деле означают процессы в контексте Android? Когда я закрываю приложение и запускаю его снова, происходит ли тот же процесс? - person AlexSee; 28.03.2018

FileLock работает с FileInputStream, НО только в том случае, если он получен как общая блокировка.

  FileInputStream fis = new FileInputStream(file + ext);
  FileChannel fileChannel = fis.getChannel();
  FileLock fileLock = fileChannel.tryLock(0L, Long.MAX_VALUE, /*shared*/true);

На самом деле это имеет смысл. Общая блокировка означает, что может быть любое количество одновременных читателей, но нет разрешенных писателей. В то время как эксклюзивная блокировка по умолчанию дает процессу эксклюзивный доступ к записи. Поскольку вы не можете писать с помощью FileInputStream, вы должны установить для него общую блокировку.

person southerton    schedule 04.11.2015

Я думаю, что блокировка файлов работает на «внутренней» памяти телефона, но не работает на SD-карте.

person Sergey Galin    schedule 27.08.2013