Как я могу переименовать существующий файл, не перемещая его?

У меня есть каталог, в котором Filewatcher ожидает новых файлов. Как только CSV-файл распечатывается, наблюдатель захватывает его, и происходит бизнес-логика.

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

Я хотел бы сохранить данные в файл .tmp, а затем переименовать файл с помощью Java БЕЗ необходимости его перемещения, поскольку для перемещения часто требуется копирование файла.

Есть ли способ сделать это?

File.renameTo?
Generous Badger 27.06.2024 14:15

Что это за ОС? По крайней мере, в Unixoids фраза «перемещение часто требует копирования файла» требует большой звездочки.

Sören 27.06.2024 14:17

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

Guy Incognito 27.06.2024 14:20

Поэтому я получаю сообщение об ошибке, поскольку FileWatcher считает, что файл неполный. Это загадочно. Что это значит?

g00se 27.06.2024 14:23

Немного похоже на проблему XY. Если вы пытаетесь решить проблему с файлами, в которые все еще ведется запись, вам следует найти способ ее избежать, а не обойти. Функция tmpfile будет работать только до тех пор, пока ваши файлы никогда не будут записаны или удалены после создания.

Cubic 27.06.2024 14:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
5
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Files.move(from, to, StandardCopyOptions.ATOMIC_MOVE).

В более общем смысле Files.move делает то, что говорит: движется. Однако это может быть реализовано как «скопируйте, затем удалите from». Он старается этого не делать.

Если включен флаг ATOMIC_MOVE и задание невозможно выполнить без копирования и удаления, вы просто получите исключение.

Итак, это ничего не меняет, это просто смягчает ваш необоснованный страх: если то, чего вы боитесь, произойдет (это не произойдет, если только вы не сделаете что-нибудь глупое, например, создадите это в одной файловой системе, а затем «переместите» его в место в другой системе, что, конечно, невозможно сделать без механики копирования и удаления по понятным причинам) - тогда вы получите исключение.

Другие вопросы по теме