【问题标题】:How to use FileLock on android?如何在安卓上使用 FileLock?
【发布时间】:2013-02-28 18:42:52
【问题描述】:

我认为我们能够锁定文件以进行独占访问,因为我看到了这个链接:http://developer.android.com/reference/java/nio/channels/FileLock.html

我想在后台进程(服务)和真正的前台应用程序中创建保存/加载文件。他们可能会尝试同时访问此文件,在这种情况下,应该等待。

我在 android 上找不到 FileLock 的真实示例,我只是阅读了许多线程,这在 Android 上是不可能的。但如果是这样,为什么文档中有一个“FileLock”部分?

【问题讨论】:

    标签: java android filelock


    【解决方案1】:

    这适用于普通的 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 吗?两者都会返回相同的频道号吗?
    • 所以这将在进程之间工作,对吧? (我的意思是,2 个单独的进程会互相等待)
    • @frankish 试试lock.isShared()
    • 在 android 21 上 getChannel() 返回一个与该流共享其位置的只写 FileChannel。所以阅读时没有办法锁定。如果你尝试这样做,你会得到异常: FileInputStream fis = getActivity().openFileInput(fname); FileLock lock = fis.getChannel().lock(); //这里有异常
    【解决方案2】:
    1. 您可以尝试 lock() 屏蔽,trylock() 不屏蔽
    2. FileLock 不适用于 FileInputStream
    3. 在 Android 中,FileLock 在进程之间起作用,但在进程中的线程之间不起作用。

    【讨论】:

    • Android 上下文中的进程实际上是什么意思?当我关闭应用程序并重新启动它时,它是相同的过程吗?
    【解决方案3】:

    FileLock 仅在作为共享锁获取时才对 FileInputStream 起作用。

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

    其实这是有道理的。共享锁意味着可以有任意数量的同时读取者,但不允许写入者。而默认的独占锁使进程独占访问写入。因为你不能用 FileInputStream 写,你必须在它上面获取共享锁。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-05-24
        • 1970-01-01
        • 1970-01-01
        • 2014-10-22
        • 2017-03-29
        • 1970-01-01
        • 1970-01-01
        • 2013-08-10
        • 2012-05-10
        相关资源
        最近更新 更多