Я пишу программу, которая следит за каталогом и когда в нем создаются файлы, она изменяет имя и перемещает их в новый каталог. В моей первой реализации я использовал Java Watch Service API, который отлично работал, когда я тестировал 1kb-файлы. Проблема, которая возникла, заключается в том, что на самом деле создаваемые файлы находятся где угодно от 50-300 мб. Когда это произошло, API-интерфейс наблюдателя сразу найдет файл, но не сможет его переместить, поскольку он все еще записывается. Я попытался поставить наблюдателя в цикл (который генерировал исключения, пока файл не мог быть перемещен), но это показалось довольно неэффективным.Java: просмотр каталога для перемещения больших файлов
Поскольку это не сработало, я попытался использовать таймер, который проверяет папку каждые 10 секунд, а затем перемещает файлы, когда это возможно. Это тот метод, в который я попал.
Вопрос: Есть ли какие-либо сигналы, когда файл записывается без проверки исключения или постоянного сравнения размера? Мне нравится идея использовать API Watcher только один раз для каждого файла, а не постоянно проверять таймер (и работать с исключениями).
Все отзывы приветствуются!
нт
'Я пытался помещать наблюдателя в цикл (который генерировал исключения, пока файл не мог быть перемещен), но это казалось довольно неэффективным.« Да, это ужасное решение. Исключения не предназначены для управления потоком управления. –
Печально @ntmp, из того, что я тестировал до сих пор, поиск исключений был лучшим способом сказать, что ОС все еще «писала» или «копировала» файл. Но я согласен с @Sean Patrick Floyd, что это ужасный способ заставить его работать. Лично мне хотелось бы, чтобы чек был частью API java.io.File. Не уверен, почему это не так. Осталось бы ребятам JVM реализовать и упростить для нас разработчиков .... –
Подход «проверка на исключение» даже не работает в UNIX, поскольку файловые системы UNIX не блокируют файлы, которые записываются. В UNIX java с радостью переместит частично написанный файл, что приведет к повреждению данных. – Raman