2013-02-28 1 views
3

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

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

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

ответ

3

Это работает на обычное приложение 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(); 
+0

Могу ли я смешивать FileOutputStream и FileInputStream? оба будут возвращать один и тот же номер канала? – frankish

+0

Да, насколько я знаю. –

+0

Итак, это будет работать между процессами, правильно? (Я имею в виду, 2 отдельных процесса будут ждать друг друга) – frankish

1

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

4
  1. Вы можете попробовать lock() с блокировкой и без блокировки trylock()
  2. FileLock не работает на FileInputStream.
  3. В Android FileLock работает между процессами, но не работает между потоками в процессе.
1

FileLock действительно работает с FileInputStream, но только если приобретен в качестве общей блокировки.

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

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