У меня есть код для работы с некоторым файлом:
Path path = ...;
if (!path.toFile().exists() || Files.size(path) == 0L) {
Files.write(path, data, StandardOpenOption.CREATE);
}
Он работает почти всегда, но в некоторых случаях он переопределяет существующий файл, поэтому я получаю поврежденный файл со старыми данными, перезаписываемыми с новымиданные.Например, если содержимое файла было 00000000000000
и data
равно AAA
в приведенном выше коде, я получу файл с содержимым AAA00000000000
.Доступ к файлу хорошо синхронизирован, поэтому только один поток может получить доступ к файлу, одновременно может быть запущен только один экземпляр приложения.Приложение работает на Heroku (это управляемая героем файловая система), я не могу воспроизвести такое же поведение на своем ноутбуке.
Возможно ли, что Files.size(path)
возвращает ноль для файла с некоторыми данными?Как переписать этот код, чтобы он работал правильно?Можно ли использовать другие StandardOpenOption
флаги для сбоя (выбросить исключение), если файл не пустой или не существует?