У меня есть каталог, в котором Filewatcher ожидает новых файлов. Как только CSV-файл распечатывается, наблюдатель захватывает его, и происходит бизнес-логика.
Похоже, что FileWatcher захватывает файл раньше, когда Java все еще записывает в файл. Поэтому я получаю сообщение об ошибке, поскольку FileWatcher считает, что файл неполный.
Я хотел бы сохранить данные в файл .tmp, а затем переименовать файл с помощью Java БЕЗ необходимости его перемещения, поскольку для перемещения часто требуется копирование файла.
Есть ли способ сделать это?
Что это за ОС? По крайней мере, в Unixoids фраза «перемещение часто требует копирования файла» требует большой звездочки.
Я не знаю ни одной современной (или древней) ОС или файловой системы, в которой перемещение файла в том же разделе потребовало бы копирования данных. А если это так, то на то есть причина, и вы не можете просто пропустить это.
Поэтому я получаю сообщение об ошибке, поскольку FileWatcher считает, что файл неполный. Это загадочно. Что это значит?
Немного похоже на проблему XY. Если вы пытаетесь решить проблему с файлами, в которые все еще ведется запись, вам следует найти способ ее избежать, а не обойти. Функция tmpfile будет работать только до тех пор, пока ваши файлы никогда не будут записаны или удалены после создания.
Files.move(from, to, StandardCopyOptions.ATOMIC_MOVE)
.
В более общем смысле Files.move
делает то, что говорит: движется. Однако это может быть реализовано как «скопируйте, затем удалите from
». Он старается этого не делать.
Если включен флаг ATOMIC_MOVE
и задание невозможно выполнить без копирования и удаления, вы просто получите исключение.
Итак, это ничего не меняет, это просто смягчает ваш необоснованный страх: если то, чего вы боитесь, произойдет (это не произойдет, если только вы не сделаете что-нибудь глупое, например, создадите это в одной файловой системе, а затем «переместите» его в место в другой системе, что, конечно, невозможно сделать без механики копирования и удаления по понятным причинам) - тогда вы получите исключение.
File.renameTo
?