在Java中,什么是监视附加文件的最佳/最安全模式?


问题内容

别人的过程是通过在事件发生时一次向其添加一行来创建CSV文件。我无法控制文件格式或其他过程,但我知道它只会追加。

在Java程序中,我想监视此文件,并在添加一行后读取新行并根据内容做出反应。现在忽略CSV解析问题。监视文件的更改并一次读取一行的最佳方法是什么?

理想情况下,这将使用标准库类。该文件很可能位于网络驱动器上,所以我想提供一些可以防止故障的文件。如果可能,我宁愿不使用轮询-我宁愿使用某种阻塞解决方案。

编辑-鉴于标准类不可能使用阻塞解决方案(感谢您的回答),最健壮的轮询解决方案是什么?我不想每次都重新读取整个文件,因为它可能会变得很大。


问题答案:

从Java
7开始,FileSystem类上有了newWatchService()方法。

但是,有一些警告:

  • 只有Java 7
  • 这是一种可选方法
  • 它只监视目录,因此您必须自己处理文件,并担心文件移动等

在Java 7之前,无法使用标准API。

我尝试了以下操作(以1秒的间隔进行轮询),并且可以正常工作(仅在处理过程中打印):

  private static void monitorFile(File file) throws IOException {
    final int POLL_INTERVAL = 1000;
    FileReader reader = new FileReader(file);
    BufferedReader buffered = new BufferedReader(reader);
    try {
      while(true) {
        String line = buffered.readLine();
        if(line == null) {
          // end of file, start polling
          Thread.sleep(POLL_INTERVAL);
        } else {
          System.out.println(line);
        }
      }
    } catch(InterruptedException ex) {
     ex.printStackTrace();
    }
  }

正如没有人建议使用当前生产的Java的解决方案一样,我想我会添加它。如果存在缺陷,请添加注释。