将文件/“文件夹”锁定到特定的JVM,并在锁定时进行迭代

时间:2018-09-18 09:35:43

标签: java filelock

我正在使用多个JVM,但是我需要每个JVM使用特定的文件夹。我想要做的是遍历文件夹,直到找到未锁定的文件,然后锁定它以使用该特定文件夹。

这里我正在过滤要使用的文件夹:

  // Filter 'fran' folders
  String dir = System.getProperty("user.dir");
  FilenameFilter filter = new FilenameFilter() {
     public boolean accept(File dir, String name) {
        String lowercaseName = name.toLowerCase();
        if (lowercaseName.startsWith("fran")) {
           return true;
        } else {
           return false;
        }
     }
  };
  File[] dirs = new File(dir).listFiles(filter);

然后,我尝试浏览文件夹,并使用f.canWrite()检查它是否被锁定。但是,它似乎总是只使用一个文件夹,而忽略其他文件夹。

  // Find available folder
  boolean lock = true;
  String lock_folder = "";
  FileChannel fileChannel = null;
  FileLock lockfile = null;
  File f = null;

  while (lock) {
     for (File folder : dirs) {
        f = new File(folder + "\\lock.txt");
        Boolean isnotlocked = f.canWrite();
        if (isnotlocked) {
           fileChannel = new RandomAccessFile(f, "rw").getChannel();
           lockfile = fileChannel.lock();
           lock = false;
           lock_folder = folder.getAbsolutePath();
           break;
        }
     }
  }

我以前尝试过在没有FileLock的情况下完成所需的工作,在特定文件夹中创建文件,然后在完成后删除。如果该文件夹没有该文件,它将创建并锁定该JVM。但是我认为JVM混合起来会导致结果不好。

希望您能理解我的问题所在,非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

以下是一些想法:

假设一个进程类-CustomProcess.java。这在单独的线程中运行。该类具有一个构造函数,该构造函数将文件夹作为参数。假设filePath1是文件夹的路径,并且从FileChooser接受。

(a)应用程序的工作方式:

将所选文件夹filePath1放入List<File>List<Path>之类的集合中-称其为processFilesList;这由所有进程共享(也许是static成员)(这需要是java.util.concurrent包的并发集合)。此列表跟踪已被处理的文件夹。在该过程开始之前,请检查filePath1中是否已存在processFilesList

(b)创建并开始该过程:

CustomProcess p1 = new CustomProcess(filePath1);
p1.startProcess(); // here the application does whatever with the files in the folder.


选项2

将所有需要处理的文件夹文件路径放入Queue集合中。一次或通过多个进程处理每个文件夹(及其所需的文件)。队列可以是先进先出(FIFO)或后进先出(LIFO)。可以根据以下要求考虑这些并发队列实现:ConcurrentLinkedQueueLinkedBlockingQueueConcurrentLinkedDequeLinkedBlockingDeque