有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

父子JAVA:多个不在Linux中工作的JAVA应用程序之间的文件共享和锁定

我有两个独立的Java进程。说ABC和DEF。DEF是ABC的子级(也就是说,DEF是由ABC生成的。ABC和DEF分别使用两个jar文件ABC.jar和DEF.jar生成)。我的要求是保留一个ABC和DEF共用的文件。此文件由ABC创建,将被锁定。DEF检查文件是否已解锁。如果解锁,则进程将退出。这是为了解决孤立进程的问题,其中父进程崩溃时子进程不会被杀死

因此,在这种情况下,ABC创建的文件将保持锁定状态,直到ABC退出。DEF已在检查文件的锁是否已释放。由于要释放的锁的条件是ABC终止,DEF将在ABC终止时立即终止

因此,我创建了一个文件锁。ABC过程中的java类:-

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileLock;

public class FileLock {

    public FileLockExample() throws FileNotFoundException {
        FileOutputStream fileOutStream;
        try {
            fileOutStream= new FileOutputStream("Temp.txt");
            FileLock fileLock ;
            try {
                fileLock = fileOutStream.getChannel().tryLock();
                if (fileLock != null) {
                    System.out.println("Locked File");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {

            e.printStackTrace();
        }

    }
}

所以,一个临时文件。txt已创建并被锁定

现在,我在DEF中添加了一个函数,用于检查文件是否已锁定

public static void isFileUnlocked() {
        Integer count = 1000;
        boolean isFirstTry = false;
        while (count > 0) {
            try {
                if (!isFirstTry) {
                    FileOutputStream fos = new FileOutputStream("Temp.txt");
                    FileLock fileLock = fos.getChannel().tryLock();
                    isFirstTry = true;
                }
                FileInputStream fis = new FileInputStream("Temp.txt");
                fis.read();
                System.exit(0);
            } catch (IOException x) {

            }
          Thread.sleep(1000);
          count--;
        }
    }

process DEF中的函数isFileUnlocked()检查文件锁是否每1秒释放一次。如果解除锁定,则表示ABC由于某些原因已终止。因此,一旦释放文件锁,DEF就会退出

我在Windows中验证了这一点,它似乎正在工作。然而,在Linux中,只要调用函数isFileUnlocked(),进程DEF就会存在。因此,当DEF尝试读取该文件时,它能够这样做。(这可能意味着该文件已解锁)

有什么想法吗


共 (1) 个答案

  1. # 1 楼答案

    假设在调用方法checkIfFileIsUnlocked()时[locked]文件未关闭,并且假设您正在使用正确的参数调用方法checkIfFileIsUnlocked(),为了测试文件是否已锁定,您需要从文件中读取。仅打开文件不会引发异常

    这是一个写得很糟糕的示例,但它只是为了演示如何实现检查

    
    try {
        FileOutputStream fos = new FileOutputStream("lockfile.txt");
        FileLock fileLock = fos.getChannel().tryLock();
    
        FileInputStream fis = new FileInputStream("lockfile.txt");
        fis.read();
    }
    catch (IOException x) {
        x.printStackTrace();
    }
    

    当上面的代码运行时,下面的一行抛出一个异常

    fis.read()
    

    例外情况是:

    java.io.IOException: The process cannot access the file because another process has locked a portion of the file