Я хочу получать уведомление об изменении файла в файловой системе. Я не нашел ничего, кроме потока, который опрашивает свойство lastModified File, и ясно, что это решение не оптимально.
Спасибо за все ответы. Поскольку мои потребности невелики (мне нужно только перезагрузить файл свойств, измененный в моем веб-приложении .. в основном потому, что перезапуск всего веб-приложения происходит довольно медленно), я буду придерживаться модели опроса. По крайней мере, теперь я знаю, что для этих случаев нет простого решения.
cheng81
14
Просто примечание. Когда мы решили эту проблему раньше, мы обнаружили, что большие файлы, как правило, поступают медленно, а механизм опроса часто обнаруживал новый или измененный файл до того, как он был полностью записан. Чтобы решить эту проблему, было принято решение «на два укуса». Опрашивающий заметил, что файл был изменен, но не уведомил систему о новом / измененном файле, пока он не выглядел одинаково для двух опросов: т.е. не стабилизировался. Вылечил множество ошибок с плохими файлами.
Стив Пауэлл,
1
Кроме того, Tomcat страдает от этой проблемы при перетаскивании больших файлов WAR в папку webapps из удаленных источников и делает это уже долгое время.
Джон Рикс
Ответы:
21
На низком уровне единственный способ смоделировать эту утилиту - это опрос потока в каталоге и наблюдение за атрибутами файла. Но вы можете использовать шаблоны для разработки адаптера для такой утилиты.
Например, серверы приложений j2ee, такие как Tomcat и другие, имеют функцию автоматической загрузки, при которой, как только изменяется дескриптор развертывания или класс сервлета, приложение перезапускается.
Вы можете использовать библиотеки с таких серверов, поскольку большая часть кода tomcat является многоразовым и имеет открытый исходный код.
Этот API крайне неадекватен, он не предоставляет уведомления о событиях закрытия файлов в Linux. Итак, в простом случае, когда файл закрыт, скопировать его в другой каталог не получится.
binarytemple_picsolve
117
Раньше я писал монитор файлов журнала и обнаружил, что влияние на производительность системы опроса атрибутов одного файла несколько раз в секунду на самом деле очень мало.
я рассматриваю примеры как каталог для просмотра, но как насчет отдельного файла?
Archimedes Trajano
@ArchimedesTrajano API уведомляет вас об изменении файла в каталоге. Запускаемое событие включает имя файла, который был изменен. Таким образом, вы можете обрабатывать события для определенного файла или файлов и игнорировать другие.
Существует библиотека jnotify, которая обертывает inotify в Linux, а также поддерживает Windows. Никогда не использовал, и я не знаю, насколько он хорош, но я бы сказал, что попробовать стоит.
Он отлично работает и очень прост в использовании. Пользуюсь inotify много лет. Это быстрый, стабильный и надежный
oᴉɹǝɥɔ
8
В Java commons-io есть FileAlterationObserver . он выполняет опрос в сочетании с FileAlterationMonitor. Аналогично общему VFS. Преимущество в том, что у него гораздо меньше зависимостей.
edit: Меньше зависимостей неверно, они не являются обязательными для VFS. Но он использует файл java вместо уровня абстракции VFS.
Я запускаю этот фрагмент кода каждый раз, когда иду читать файл свойств, фактически читая файл только в том случае, если он был изменен с момента последнего чтения. Надеюсь, это кому-то поможет.
privatelong timeStamp;privateFile file;privateboolean isFileUpdated(File file ){this.file = file;this.timeStamp = file.lastModified();if(this.timeStamp != timeStamp ){this.timeStamp = timeStamp;//Yes, file is updatedreturntrue;}//No, file is not updatedreturnfalse;}
Аналогичный подход используется в Log4J FileWatchdog.
Если вы готовы расстаться с деньгами, JNIWrapper - полезная библиотека с Winpack, вы сможете получать события файловой системы для определенных файлов. К сожалению только окна.
В противном случае обращение к собственному коду не всегда плохо, особенно когда лучшее из предлагаемых - это механизм опроса, а не собственное событие.
Я заметил, что операции файловой системы Java могут быть медленными на некоторых компьютерах и могут легко повлиять на производительность приложения, если с ними не справиться.
Вы также можете рассмотреть Apache Commons JCI (интерфейс компилятора Java). Хотя этот API, похоже, ориентирован на динамическую компиляцию классов, он также включает классы в свой API, который отслеживает изменения файлов.
Существует коммерческая кросс-десктопная библиотека для просмотра файлов и папок под названием JxFileWatcher. Его можно скачать здесь:
http://www.teamdev.com/jxfilewatcher/
Однако опрос последнего измененного свойства файла - простое, но эффективное решение. Просто определите класс, расширяющий мой, FileChangedWatcherи реализуйте onModified()метод:
Как и в других ответах, вот как я это сделал, используя File, Timer и TimerTask, чтобы позволить этому запускать в качестве фонового опроса потока через заданные интервалы.
Ответы:
На низком уровне единственный способ смоделировать эту утилиту - это опрос потока в каталоге и наблюдение за атрибутами файла. Но вы можете использовать шаблоны для разработки адаптера для такой утилиты.
Например, серверы приложений j2ee, такие как Tomcat и другие, имеют функцию автоматической загрузки, при которой, как только изменяется дескриптор развертывания или класс сервлета, приложение перезапускается.
Вы можете использовать библиотеки с таких серверов, поскольку большая часть кода tomcat является многоразовым и имеет открытый исходный код.
источник
Раньше я писал монитор файлов журнала и обнаружил, что влияние на производительность системы опроса атрибутов одного файла несколько раз в секунду на самом деле очень мало.
Java 7, как часть NIO.2, добавила WatchService API
источник
Я использую VFS API от Apache Commons, вот пример того, как отслеживать файл без особого влияния на производительность:
DefaultFileMonitor
источник
Существует библиотека jnotify, которая обертывает inotify в Linux, а также поддерживает Windows. Никогда не использовал, и я не знаю, насколько он хорош, но я бы сказал, что попробовать стоит.
источник
В Java commons-io есть FileAlterationObserver . он выполняет опрос в сочетании с FileAlterationMonitor. Аналогично общему VFS. Преимущество в том, что у него гораздо меньше зависимостей.
edit: Меньше зависимостей неверно, они не являются обязательными для VFS. Но он использует файл java вместо уровня абстракции VFS.
источник
«Дополнительные функции NIO» включают функцию отслеживания файлов, реализация которой зависит от базовой ОС. Должен быть в JDK7.
источник
java.nio.file
. См. Учебник .Я запускаю этот фрагмент кода каждый раз, когда иду читать файл свойств, фактически читая файл только в том случае, если он был изменен с момента последнего чтения. Надеюсь, это кому-то поможет.
Аналогичный подход используется в Log4J
FileWatchdog
.источник
Вы можете прослушивать изменения файлов с помощью FileReader. Пожалуйста, посмотрите пример ниже
источник
Если вы готовы расстаться с деньгами, JNIWrapper - полезная библиотека с Winpack, вы сможете получать события файловой системы для определенных файлов. К сожалению только окна.
См. Https://www.teamdev.com/jniwrapper .
В противном случае обращение к собственному коду не всегда плохо, особенно когда лучшее из предлагаемых - это механизм опроса, а не собственное событие.
Я заметил, что операции файловой системы Java могут быть медленными на некоторых компьютерах и могут легко повлиять на производительность приложения, если с ними не справиться.
источник
Вы также можете рассмотреть Apache Commons JCI (интерфейс компилятора Java). Хотя этот API, похоже, ориентирован на динамическую компиляцию классов, он также включает классы в свой API, который отслеживает изменения файлов.
Пример: http://commons.apache.org/jci/usage.html
источник
Spring Integration предоставляет удобный механизм для просмотра каталогов и файлов: http://static.springsource.org/spring-integration/reference/htmlsingle/#files . Уверен, что это кроссплатформенный (я использовал его на Mac, Linux и Windows).
источник
Существует коммерческая кросс-десктопная библиотека для просмотра файлов и папок под названием JxFileWatcher. Его можно скачать здесь: http://www.teamdev.com/jxfilewatcher/
Также вы можете увидеть это в действии онлайн: http://www.teamdev.com/jxfilewatcher/onlinedemo/
источник
Однако опрос последнего измененного свойства файла - простое, но эффективное решение. Просто определите класс, расширяющий мой,
FileChangedWatcher
и реализуйтеonModified()
метод:источник
Как и в других ответах, вот как я это сделал, используя File, Timer и TimerTask, чтобы позволить этому запускать в качестве фонового опроса потока через заданные интервалы.
источник