Как сделать резервную копию данных на отключенном аккумуляторе в Android? - PullRequest
1 голос
/ 30 декабря 2011

Я разрабатываю приложение, которое записывает данные в файл.Предположим, что во время записи данных мы отключаем аккумулятор.Что будет с файлом?будет ли он наполовину написан (поврежден), пустым или таким же, как прежде, чем мы написали в него?Я предполагаю, что это будет повреждено.Как проверить, не поврежден ли он, когда мы перезагружаем телефон, когда файл хранил массив объектов?выдаст ли java исключение из поврежденного файла или скажет, что прочитанный массив данных равен нулю или что это неизвестный объект?

PS.Может быть, создать другой файл, который будет хранить контрольную сумму MD5 файла данных?И всякий раз, когда я записываю в файл данные сначала, я создаю контрольную сумму, а затем, когда я читаю из файла данных, создаю контрольную сумму и сравниваю ее с предыдущей.Это будет указывать, не повреждены ли мои данные, но не позволит мне вернуться к предыдущему состоянию (предварительно поврежденному).Мне бы хотелось, чтобы метод был как можно более легким, я уже слишком много использую ЦП, считывая / записывая изменения в моем хранилище при каждом изменении атрибута множества тысяч.Возможно, база данных была бы лучшей идеей.

1 Ответ

3 голосов
/ 30 декабря 2011

Я не могу сказать, как Java будет читать в поврежденном сериализованном массиве, но для безопасности предположим, что нет обнаружения ошибок.

В этом случае у вас есть два простых варианта:

  • Сохраните контрольную сумму ваших данных внутри структуры данных, прежде чем сериализовать ее.
  • Вычислить контрольную сумму окончательного сериализованного файла.

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

Как вы упомянули, MD5 было бы хорошо для этого.(Даже простой CRC , вероятно, подойдет - вам не нужен криптографический хеш для этого.)

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

И да, на этом этапе вы можете просто использовать функциональность SQLite, встроенную в Android.:)

...