Я думаю, вы неправильно понимаете, что такое атомный ход:
- Только ход атомный. Остальная часть обработки вашего файла не выполняется.
- Гарантии атомарности POSIX предназначены для работающего программного обеспечения, а не для ситуации с потерей питания.
Рассмотрим ваш код:
void foo(String fullFileName) {
// 1
Path source = Paths.get(fullFileName + ".tmp");
// 2
Path target = Paths.get(fullFileName);
// 3
Files.delete(target);
// 4
Files.move(source, target, StandardCopyOption.ATOMIC_MOVE);
// 5
}
Если программа прерывается на 1, 2 или 3, то вы оставляете оба файла в системе. Ваш атомный ход еще не был задействован, поэтому ничто из того, что он там сделал, ни на что не повлияет.
Если программа будет прервана на 4 или 5, у вас будет только один файл, но если питание будет прервано, больше нет никаких гарантий относительно состояния файловой системы, когда она возвращается.
Похоже, вам нужна база данных с поддержкой транзакций.