如何在安卓系统上使用FileLock?

3
我认为我们可以通过以下链接实现对文件的独占式访问:http://developer.android.com/reference/java/nio/channels/FileLock.html
我想在后台进程(服务)和前台应用程序中创建一个保存/加载文件的功能。它们可能同时尝试访问该文件,这种情况下应该等待其中一个。
我没有找到Android上有关FileLock的真正示例,只是读了很多线程,称这在Android上不可能。但如果是这样,那么为什么文档有一个“FileLock”部分呢?
4个回答

7

这适用于普通的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();

我可以混合使用FileOutputStream和FileInputStream吗?它们会返回相同的通道号吗? - frankish
这样就可以在进程之间工作了,对吧?(我的意思是,两个独立的进程将互相等待) - frankish
@frankish 请尝试使用lock.isShared() - Eng.Fouad
1
在Android 21上,getChannel()返回一个只写的FileChannel,它与此流共享其位置。因此,在读取时无法锁定。如果尝试这样做,您将会收到异常:FileInputStream fis = getActivity().openFileInput(fname); FileLock lock = fis.getChannel().lock(); //exception here - Deepscorn

5
  1. 您可以尝试使用具有阻塞的lock()和不带阻塞的trylock()
  2. FileLock无法在FileInputStream上工作。
  3. 在Android中,FileLock在进程之间工作,在进程的线程之间不起作用。

在Android上下文中,进程实际上是什么意思?当我关闭应用程序并再次启动它时,它是否是同一个进程? - AlexSee

2

FileLock可以在FileInputStream上工作,但仅在获得共享锁时。

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

实际上这是有道理的。共享锁意味着可以有任意数量的同时读取者,但不允许写入者。而默认的独占锁给予进程对写入的独占访问权限。由于FileInputStream不能进行写入操作,因此必须在其上获取共享锁。


1
我认为文件锁定适用于“内部”手机存储器,但不适用于SD卡。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接