Java - Как узнать, что пользователь изменил файл конфигурации?

Я разрабатываю Java Desktop Application. Для запуска этого приложения требуется configuration. Для этого я хочу предоставить файл defaultConfig.properties или defaultConfig.xml с приложением, чтобы, если пользователь не выбрал какую-либо конфигурацию, приложение запускалось с помощью файла defaultConfig.

Но я боюсь сбоя моего приложения, если пользователь случайно отредактирует файл defaultConfig. Итак, есть ли какой-либо механизм, с помощью которого я могу проверить перед запуском приложения, изменился ли файл config или нет.

Как другие приложения (на рынке) справляются с такой ситуацией, когда их приложение зависит от файла конфигурации?


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


person Yatendra    schedule 11.03.2010    source источник
comment
Можете ли вы сохранить хэш файла при выходе из вашей программы и снова хешировать для сравнения при запуске вашей программы (перед попыткой загрузить настройки из файла конфигурации)?   -  person Imran    schedule 11.03.2010
comment
Why случайно words в вашем question выделены как code?   -  person Nate    schedule 11.03.2010


Ответы (5)


Я согласен с Дэвидом в том смысле, что использование хеша MD5 — это хороший и простой способ добиться желаемого.

По сути, вы должны использовать хэш-код MD5, предоставленный JDK (или где-то еще), для создания хэш-кода на основе данных по умолчанию в Config.xml и сохранить этот хэш-код в файл (или жестко закодировать его в функцию, которая осуществляет проверку). Затем каждый раз, когда ваше приложение запускается, загружайте хэш-код, который вы сохранили в файл, а затем загружайте файл Config.xml и снова генерируйте из него хэш-код, сравнивайте сохраненный хэш-код с генерируемым из загруженного конфига. файла, если они одинаковые, то данные не изменились, если разные, то данные были изменены.

Однако, как предлагают другие, если пользователь не должен редактировать файл, вам следует рассмотреть возможность сохранения конфигурации таким образом, чтобы пользователь не мог легко редактировать. Самое простое, что я могу придумать, это обернуть Output Stream, который вы используете для записи файла Config.xml, в GZIP Output Stream. Это не только затруднит пользователю редактирование файла конфигурации, но и приведет к тому, что файл Config.xml будет занимать меньше места.

person Tom Neyland    schedule 11.03.2010

Я совсем не уверен, что это хороший подход, но если вы хотите продолжить, вы можете вычислить хэш файла конфигурации (скажем, md5) и пересчитывать и сравнивать каждый раз при запуске приложения. Если подумать, если пользователю запрещено редактировать файл, зачем его выставлять? Вставьте его, например, в файл jar, подальше от глаз пользователя.

person David Soroko    schedule 11.03.2010
comment
В отличие от файлов .exe, файлы Jar можно легко распаковать. - person Yatendra; 12.03.2010

Если конфигурация по умолчанию не предназначена для редактирования, возможно, вы вообще не хотите хранить ее в файле? Не могли бы вы напрямую сохранить значения конфигурации по умолчанию в коде?

person Thomas    schedule 11.03.2010
comment
@TomNeyland: да, может, но не обязательно, в зависимости от конкретного случая. - person Thomas; 12.03.2010

  1. Удалите права на запись для файла. Таким образом, пользователь получает предупреждение перед попыткой изменить файл.
  2. Добавьте хэш или контрольную сумму и проверьте это перед загрузкой файла
  3. Для дополнительной безопасности вы можете заменить простой хэш криптографической подписью.
person Raj    schedule 11.03.2010

Из того, что я нашел в Интернете, до сих пор, похоже, существуют разные подходы к коду. ни один из них не является 100-процентным решением, например:

DirectoryWatcher реализует AbstractResourceWatcher для наблюдения за указанным каталогом.

Код можно найти здесь twit88.com. -a-java-файл-наблюдатель

возникла одна проблема: если я скопирую большой файл из удаленного сетевого источника в отслеживаемый локальный каталог, этот файл все равно будет отображаться в списке каталогов, но до завершения сетевой копии. Если я попытаюсь сделать с файлом что-то нетривиальное в этот момент, например, переместить его в другой каталог или открыть для записи, будет выдано исключение, потому что на самом деле файл еще не полностью там, а ОС все еще имеет блокировку записи. Это.

найдено на том же сайте, ниже.

Как работает программа Она принимает класс ResourceListener, которым является FileListener. Если в программе обнаружено изменение, будет сгенерировано событие onAdd, onChange или onDelete, которому будет передан файл.

будет продолжать искать другие решения.

person Justin Gregoire    schedule 11.03.2010