程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了无法使用java.nio.channels.FileLock在Linux上锁定文件大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决无法使用java.nio.channels.FileLock在Linux上锁定文件?

开发过程中遇到无法使用java.nio.channels.FileLock在Linux上锁定文件的问题如何解决?下面主要结合日常开发的经验,给出你关于无法使用java.nio.channels.FileLock在Linux上锁定文件的解决方法建议,希望对你解决无法使用java.nio.channels.FileLock在Linux上锁定文件有所启发或帮助;

我使用了与您相同的示例,并且在Mac OS X上遇到了同样的问题。似乎文件锁定不能防止在POSIX系统上删除文件。在解锁之前,您的应用仍会对该文件具有某种处理方式。因此,请考虑使用名称为PID的锁定文件(或内部文件)。

解决方法

我正在用Java创建一个应用程序,对于该应用程序我只希望运行一个实例。为此,我创建了一个文件,并在我的应用程序运行时锁定了它。

我有以下代码可在Windows上运行,但在Linux上无法运行:一旦我获得了一个锁而没有将其解锁,则可以再获得一个锁。

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class MyApp {

private static File f;
private static FileChannel channel;
private static FileLock lock;

public static void main(String[] args) {
    try {
        f = new File("RingOnRequest.lock");
        // Check if the lock exist
        if (f.exists()) {
            // if exist try to delete it
            f.delete();
        }
        // Try to get the lock
        channel = new RandomAccessFile(f,"rw").getChannel();
        lock = channel.tryLock();
        if(lock == null)
        {
            // File is lock by other application
            channel.close();
            throw new RuntimeException("Only 1 instance of MyApp can run.");
        }
        // Add shutdown hook to release lock when application shutdown
        ShutdownHook shutdownHook = new ShutdownHook();
        Runtime.getRuntime().addShutdownHook(shutdownHook);

        //Your application tasks here..
        System.out.println("Running");
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
    catch(IOException e)
    {
        throw new RuntimeException("Could not start process.",e);
    }

}

public static void unlockFile() {
    // release and delete file lock
    try {
        if(lock != null) {
            lock.release();
            channel.close();
            f.delete();
        }
    } catch(IOException e) {
        e.printStackTrace();
    }
}

static class ShutdownHook extends Thread {

    public void run() {
        unlockFile();
    }
}

}

大佬总结

以上是大佬教程为你收集整理的无法使用java.nio.channels.FileLock在Linux上锁定文件全部内容,希望文章能够帮你解决无法使用java.nio.channels.FileLock在Linux上锁定文件所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: