Файл изменен слушателем на Java - PullRequest
100 голосов
/ 30 января 2009

Я хотел бы получить уведомление, когда файл был изменен в файловой системе. Я не нашел ничего, кроме потока, который опрашивает свойство lastModified File, и, очевидно, это решение не является оптимальным.

Ответы [ 14 ]

1 голос
/ 09 февраля 2010

Вы также можете рассмотреть JCI Apache Commons (интерфейс компилятора Java). Хотя этот API, по-видимому, ориентирован на динамическую компиляцию классов, он также включает в свой класс классы, которые отслеживают изменения файлов.

Пример: http://commons.apache.org/jci/usage.html

1 голос
/ 18 мая 2009

Существует коммерческая библиотека для просмотра файлов и папок под названием JxFileWatcher. Его можно скачать здесь: http://www.teamdev.com/jxfilewatcher/

Также вы можете увидеть это в действии онлайн: http://www.teamdev.com/jxfilewatcher/onlinedemo/

0 голосов
/ 07 января 2016

Подобно другим ответам, вот как я это сделал, используя File, Timer и TimerTask, чтобы запустить его в качестве фонового опроса потока через заданные интервалы.

import java.io.File;
import java.util.Timer;
import java.util.TimerTask;

public class FileModifiedWatcher
{
  private static File file;
  private static int pollingInterval;
  private static Timer fileWatcher;
  private static long lastReadTimeStamp = 0L;

  public static boolean init(String _file, int _pollingInterval)
  {
    file =  new File(_file);
    pollingInterval = _pollingInterval; // In seconds

    watchFile();

    return true;
  }

  private static void watchFile()
  {
    if ( null == fileWatcher )
    {
      System.out.println("START");

      fileWatcher = new Timer();

      fileWatcher.scheduleAtFixedRate(new TimerTask()
      {
        @Override
        public void run()
        {

          if ( file.lastModified() > lastReadTimeStamp )
          {
            System.out.println("File Modified");
          }

          lastReadTimeStamp = System.currentTimeMillis();
        }
      }, 0, 1000 * pollingInterval);
    }

  }
}
0 голосов
/ 28 октября 2015

Опрос последнего измененного свойства файла является простым, но эффективным решением. Просто определите класс, расширяющий мой FileChangedWatcher, и реализуйте метод onModified():

import java.io.File;

public abstract class FileChangedWatcher
{
    private File file;

    public FileChangedWatcher(String filePath)
    {
        file = new File(filePath);
    }

    public void watch() throws InterruptedException
    {
        long currentModifiedDate = file.lastModified();

        while (true)
        {
            long newModifiedDate = file.lastModified();

            if (newModifiedDate != currentModifiedDate)
            {
                currentModifiedDate = newModifiedDate;
                onModified();
            }

            Thread.sleep(100);
        }
    }

    public String getFilePath()
    {
        return file.getAbsolutePath();
    }

    protected abstract void onModified();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...