Я работаю над небольшим Java-приложением (Java 1.6, Solaris), которое будет использовать несколько фоновых потоков для отслеживания ряда текстовых файлов для строк вывода, соответствующих определенному шаблону регулярного выражения, а затем использовать эти строки. У меня по одному потоку на файл; они записывают интересующие строки в очередь, а другой фоновый поток просто контролирует очередь, чтобы собрать все интересующие строки по всей коллекции отслеживаемых файлов.
Одна из моих проблем - это когда один из отслеживаемых мной файлов снова открывается. Многие приложения, которые создают файлы, которые я отслеживаю, просто перезапускают свой файл журнала при перезапуске; они не добавляются к тому, что уже есть.
Мне нужно, чтобы мое приложение Java обнаружило, что файл был повторно открыт, и перезапустил его после файла.
Как мне лучше всего это сделать?




Вы можете указать место в файловой системе, которое указывает, что вы читаете данный файл. Предположим, что рядом с читаемым файлом (a.txt) вы создаете рядом с ним файл (a.txt.lock), который указывает на то, что a.txt читается. Когда ваш процесс завершится, файл a.txt.lock будет удален. Каждый раз, когда процесс открывает файл для его чтения, он заранее проверяет наличие файла блокировки. Если файла блокировки нет, он не используется. Надеюсь, это имеет смысл и отвечает на ваш вопрос. ваше здоровье!
Не могли бы вы вести учет длины каждого файла? Когда текущая длина впоследствии возвращается к нулю или становится меньше, чем в последний раз, когда вы записывали длину, вы знаете, что файл был перезапущен приложением?
использование файла блокировки - это решение, о котором упоминал Юрский период.
Другой способ - попытаться открыть файл во время чтения шаблона и определить, имеет ли файл новый размер, и время создания. Если время создания НЕ такое же, как когда вы его нашли, то можете быть уверены, что оно было воссоздано.
ps, это обычно используется программами, чтобы определить, запущен ли другой экземпляр или нет