Java перезаписать файл переписать, получает старый файл при чтении - PullRequest
0 голосов
/ 10 декабря 2011

В модульном тесте я перезаписываю файл конфигурации, чтобы проверить обработку неверных значений свойств. Я использую Apache Commons IO:

org.apache.commons.io.FileUtils.copyFile(new File(configDir, "xyz.properties.badValue"), new File(configDir, "xyz.properties"), false)

При исследовании файловой системы я вижу, что xyz.properties на самом деле перезаписывается - размер обновляется, и содержимое совпадает с xyz.properties.badValue.

Когда я завершаю тестовый пример, который проходит через код, который считывает файл в объект Properties (используя объект FileReader), я получаю свойства исходного файла xyz.properties, а не вновь скопированной версии.

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

Есть ли на шаге копирования дескриптор файла? Если так, то как бы я выпустил его снова? Если нет, есть ли у кого-нибудь идеи, почему это происходит и как это решить?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 10 декабря 2011

Если вы инициализировали объект FileReader перед этим объектом, то он уже сохранит временную копию старой версии.

Вам нужно сбросить его:

FileReader f = new FileReader("the.file");

// Copy and overwrite "the.file"

f = new FileReader("the.file");

В модели файловой системы Unix inode, содержащий содержимое файла, будет сохраняться до тех пор, пока кто-то имеет открытый filehandle в файле или существует запись в каталоге, указывающая на него.

Замена имени файла в каталоге, не удаляет inode (содержимое файла), поэтому ваш уже открытый filehandle может продолжать использоваться.

На самом деле это можно использовать для создания временных файлов, которые никогда не нужно очищать: создайте файл, затем немедленно отсоедините его, сохраняя его открытым. Когда вы закрываете дескриптор файла, inode пожинается

1 голос
/ 10 декабря 2011

Я понимаю, что это не отвечает на ваш вопрос напрямую, но я думаю, что было бы лучше сохранить два отдельных файла и договориться, чтобы ваш код имел имя файла конфигурации, настраиваемого / внедряемого во время выполнения. Таким образом, ваши тесты могут указывать, какой файл конфигурации использовать, а не перезаписывать один файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...