Java: просмотр каталога для перемещения больших файлов - PullRequest
28 голосов
/ 30 июля 2010

Я писал программу, которая следит за каталогом, и когда в нем создаются файлы, он меняет имя и перемещает их в новый каталог.В моей первой реализации я использовал Java Watch API API, который работал нормально, когда я тестировал файлы размером 1 КБ.Проблема, которая возникла, заключается в том, что на самом деле создаваемые файлы имеют размер от 50 до 300 Мб.Когда это произошло, API наблюдателя сразу же нашел файл, но не смог переместить его, потому что он все еще записывался.Я попытался поместить наблюдатель в цикл (который генерировал исключения, пока файл не мог быть перемещен), но это казалось довольно неэффективным.

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

Вопрос: Есть ли какой-либо сигнал для завершения записи файла без проверки исключений или постоянного сравнения размера?Мне нравится идея использовать API-интерфейс Watcher только один раз для каждого файла вместо постоянной проверки с помощью таймера (и работы с исключениями).

Все ответы приветствуются!

nt

Ответы [ 13 ]

0 голосов
/ 12 декабря 2011

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

1- Прежде всего, сохраняйте карту необработанного файла (пока файл все еще копируется, файловая система генерирует Modify_Event, поэтому вы можете игнорировать их, если флаг установлен в ложь).

2- В вашем файловом процессоре вы выбираете файл из списка и проверяете, заблокирован ли он файловой системой. Если да, вы получите исключение, просто перехватите это исключение и переведите ваш поток в состояние ожидания (т.е. 10 секунд) и затем повторите попытку до снятия блокировки. После обработки файла вы можете изменить флаг на true или удалить его с карты.

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

Ура, Рамзи

0 голосов
/ 20 января 2011

Это очень интересное обсуждение, поскольку, безусловно, это случай использования хлеба с маслом: дождитесь создания нового файла и затем каким-то образом отреагируйте на файл.Условия гонки здесь интересны, так как, безусловно, высокоуровневое требование состоит в том, чтобы получить событие, а затем фактически получить (по крайней мере) блокировку чтения файла.С большими файлами или просто с большим количеством созданных файлов, для этого может потребоваться целый пул рабочих потоков, которые просто периодически пытаются получить блокировки для вновь создаваемых файлов и, когда они успешны, фактически выполняют свою работу.Но, как я уверен, NT понимает, что нужно делать это осторожно, чтобы сделать его масштабируемым, поскольку в конечном итоге это подход опроса, а масштабируемость и опрос - это не два слова, которые хорошо сочетаются.

0 голосов
/ 30 июля 2010

Я предполагаю, что java.io.File.canWrite () сообщит вам, когда файл будет завершен.

...