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

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

Ответы [ 14 ]

110 голосов
/ 30 января 2009

Ранее я писал монитор файлов журнала и обнаружил, что влияние на производительность системы опроса атрибутов одного файла, несколько раз в секунду, на самом деле очень мало.

Java 7, как часть NIO.2, добавила WatchService API

API WatchService предназначен для приложений, которые должны получать уведомления о событиях изменения файла.

39 голосов
/ 30 января 2009

Я использую VFS API от Apache Commons, вот пример того, как контролировать файл без особого влияния на производительность:

DefaultFileMonitor

27 голосов
/ 30 января 2009

Существует библиотека под названием jnotify , которая включает inotify в linux и также поддерживает Windows. Никогда не использовал его, и я не знаю, насколько он хорош, но стоит попробовать, скажу я.

21 голосов
/ 30 января 2009

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

Например, серверы приложений j2ee, такие как Tomcat и другие, имеют функцию автоматической загрузки, при которой после изменения дескриптора развертывания или изменения класса сервлета перезапускается приложение.

Вы можете использовать библиотеки с таких серверов, так как большая часть кода Tomcat является многоразовой и имеет открытый исходный код.

7 голосов
/ 17 марта 2013

Java commons-io имеет FileAlterationObserver . это делает опрос в сочетании с FileAlterationMonitor. Похоже на обыкновенные VFS. Преимущество в том, что у него гораздо меньше зависимостей.

edit: Меньше зависимостей не соответствует действительности, они необязательны для VFS. Но он использует Java-файл вместо уровня абстракции VFS.

3 голосов
/ 16 января 2013

Я запускаю этот фрагмент кода каждый раз, когда иду читать файл свойств, только на самом деле, читая файл, если он был изменен с момента последнего чтения. Надеюсь, это кому-нибудь поможет.

private long timeStamp;
private File file;

private boolean isFileUpdated( File file ) {
  this.file = file;
  this.timeStamp = file.lastModified();

  if( this.timeStamp != timeStamp ) {
    this.timeStamp = timeStamp;
    //Yes, file is updated
    return true;
  }
  //No, file is not updated
  return false;
}

Аналогичный подход используется в Log4J FileWatchdog.

3 голосов
/ 30 января 2009

«Больше возможностей NIO» имеет функцию просмотра файлов, реализация которой зависит от базовой ОС. Должно быть в JDK7.

2 голосов
/ 30 июля 2013

Вы можете прослушать изменения файла с помощью FileReader. Пожалуйста, см. Пример ниже

// File content change listener 
private String fname;
private Object lck = new Object();
... 
public void run()
{
    try
    {
        BufferedReader br = new BufferedReader( new FileReader( fname ) );
        String s;
        StringBuilder buf = new StringBuilder();
        while( true )
        {
            s = br.readLine();
            if( s == null )
            {
                synchronized( lck )
                {
                    lck.wait( 500 );
                }
            }
            else
            {
               System.out.println( "s = " + s );
            }

        }
    }
    catch( Exception e )
    {
        e.printStackTrace();
    }
}
2 голосов
/ 30 января 2009

Если вы готовы расстаться с деньгами, JNIWrapper - полезная библиотека с Winpack, вы сможете получать события файловой системы для определенных файлов. К сожалению, только окна.

http://www.teamdev.com/jniwrapper/index.jsf

В противном случае обращение к нативному коду не всегда плохо, особенно когда лучшее, что предлагается, - это механизм опроса по сравнению с нативным событием.

Я заметил, что на некоторых компьютерах работа файловой системы java может быть медленной и может легко повлиять на производительность приложений, если не обрабатывается должным образом.

1 голос
/ 10 мая 2012

Spring Integration предоставляет хороший механизм для просмотра каталогов и файлов: http://static.springsource.org/spring-integration/reference/htmlsingle/#files. Уверен, что он кроссплатформенный (я использовал его на Mac, Linux и Windows).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...