2012-04-12 3 views
4

Существует много подходов, можно использовать создание программы и просто вызвать команду Unix tail, однако проблема заключается в том, что процесс должен быть установлен на машине Unix с установленным хвостом.Самый эффективный способ хвостать/опросить файл журнала в Java

Другой вариант состоит в том, чтобы просто прочитать файл, по очереди, пока не будет больше строк, сон в течение определенного периода времени, а затем попробуйте прочитать следующую строку и повторить.

Вопрос в том, что/как я могу опросить файл, который активно записывается. AFAIK в Java не существует способа получения асинхронных уведомлений, когда файл был изменен, поскольку это слишком низкий уровень (что-то, что приходит из ОС). Я также не знаю никаких библиотек, которые поддерживают это.

Я думал, что лучший подход может состоять в том, чтобы спать/опросить в измененную дату файла ..?

Любые решения?

+0

Cant use Java 7 :( – NightWolf

ответ

5

Если вы можете использовать Java 7, есть Наблюдатели за файлами, и вы можете реализовать то, что вам нужно.
File Notifications

Для Java 6 (и предыдущие) вы должны использовать Apache Commons VFS (File Monitor) LIB, чтобы создать свой собственный файл Бодрствующего.

Если вы не можете пойти в Java 7 или использовать LIBS сторонних (например, обыкновенные или jnotify) вы должны записать файл сторожевого пса вашей собственной личности с помощью опроса потоков.

+0

Я подозреваю, что уведомления о файлах предназначены только для добавления и удаления записей. Существует ENTRY_MODIFY, но я думал, что это были только изменения в записи каталога, а не длина файла. –

0

я не знаю ответа. всего два советы
1. Может RandomAccessFile бы помочь вам.
2. Попробуйте найти другая программа с открытым исходным кодом, которые делают это. (например, IntelliJ IDEA делает именно это)

1

Что вы можете сделать, чтобы упростить это, - создать поток, который опросит размер файла и будет читать только то, что он никогда не достигнет цели как таковой. Это считывание данных может быть записано в трубу, позволяющую вашему основному потоку читать непрерывную трубу.

3

Вы можете использовать java nio's WatchService для получения асинхронных уведомлений, если файл/каталог был изменен. Этот tutorial объясняет, как его использовать.

+0

Java 7, can not use it in этот случай, но хорошее предложение. – NightWolf