【问题标题】:How to check FileLock without truncating file?如何在不截断文件的情况下检查 FileLock?
【发布时间】:2012-10-04 02:58:26
【问题描述】:

我最近在我的下载器异步任务中添加了文件锁:

FileOutputStream file = new FileOutputStream(_outFile);
file.getChannel().lock();

下载完成后,file.close() 解除锁定。

从一个调用的 BroadcastReceiver(不同的线程),我需要查看文件并查看哪些文件已下载,哪些仍处于锁定状态。我从 trylock 开始:

for (int i=0; i<files.length; i++) {
    try {
        System.out.print((files[i]).getName());
        test = new FileOutputStream(files[i]);
        FileLock lock = test.getChannel().tryLock();
        if (lock != null) {
            lock.release();
            //Not a partial download. Do stuff.
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        test.close();
    }
}

不幸的是,当创建 FileOutputStream 时,我读到文件被截断(0 字节)。 我设置为append,但是锁好像没有生效,好像都解锁了(完全下载)

是否有另一种方法可以检查当前是否对文件应用了写锁,或者我在这里使用了错误的方法?另外,有没有办法从 ADB 终端或 Eclipse 调试文件锁?

【问题讨论】:

    标签: java android multithreading fileoutputstream filelock


    【解决方案1】:

    这些都行不通。检查Javadoc。锁是代表整个进程(即 JVM)持有的,而不是由单个线程持有。

    【讨论】:

    • 我不明白,我代表我的应用进程持有锁。
    • 不确定为什么线程只想为自己锁定,但这似乎就是它正在做的事情。您知道将文件标记为正在使用的更好方法吗?
    • @NoBugs 不,您不希望线程 A 持有锁,而线程 B 在线程 A 释放它之前无法获得锁。关键是 tryLock() 总是会成功,因为整个进程已经拥有了锁。您的代码依赖于它失败,即返回 null。
    • 我没有投反对票,我认为您对此可能是对的,但您的回答并未包含 Java 进程无法查找自己的锁的解释。它也没有说明可以使用什么。
    • @NoBugs 它直接来自我所做的陈述,它在我提到的Javadoc 中。 “如果由于另一个程序持有重叠锁而未能获取锁,则它返回null”[我的重点]。毫无疑问。
    【解决方案2】:

    我的第一个想法是根据javadocs 打开它以进行附加

    test = new FileOutputStream(files[i], true); // the true specifies for append
    

    【讨论】:

    • 很好,现在它不会删除文件,但它似乎无法识别锁。所有文件似乎都未锁定。
    • 您可能遇到了 EJP 描述的问题。如果每个进程都持有锁,那么即使进程中的另一个线程已经锁定了锁,您也可以申请该锁。不幸的是,我对那部分没有答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多