Статьи

Постоянство Android: внутренняя память


Как разработчики Android, у нас есть несколько вариантов сохранения данных наших приложений при каждом запуске:

  • База данных SQLite
  • внешнее хранилище на SD-карте или через сеть
  • SharedPreferences (см. Предыдущую статью )
  • или мы можем использовать внутреннюю файловую систему телефона и хранить данные в файлах, которые по умолчанию видны только нашему приложению.

Почему мы хотим использовать внутренние файлы для сохранения данных? Из-за следующих соображений:

  1. Если  база данных SQLite была бы излишней для нашего варианта использования, и мы, как всегда, ищем простейшее решение, которое работает
  2. Если  SharedPreferences не соответствует нашим функциональным требованиям. Например, нам может понадобиться сохранить целые объекты, а не только примитивы. или наше приложение использует несколько процессов ( в настоящее время не поддерживается API SharedPreferences )
  3. Если внешнее хранилище на SD-карте не соответствует нашим требованиям безопасности, так как все другие приложения могут читать файлы, хранящиеся на SD-карте. Кроме того, пользователь может удалить эти файлы случайно.
  4. Если внешнее хранилище на каком-либо веб-сервере не подходит, потому что мы хотим, чтобы наше приложение могло получать доступ к постоянным данным даже при отсутствии подключения к Интернету.

Использование внутреннего файла для сохранения данных довольно просто: мы сохранять и извлекать данные , используя
Android.content.Context «s
openFileOutput () и
openFileInput () , которые возвращают
java.io.FileOutputStream и
java.io.FileInputStream соответственно. Оттуда это просто наши типичные операции ввода-вывода с файлами Java.

String FILENAME = "xfile";

// saving into file
FileOutputStream fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
// write I/O using write() and close()

//...
// retrieving from file
FileInputStream fis = context.openFileInput(FILENAME);
// read I/O using read() and close()

Context.MODE_PRIVATE означает, что наши внутренние файлы видны только нам. Есть и другие режимы, такие как MODE_APPEND, MODE_WORLD_READABLE и MODE_WORLD_WRITABLE, которые не требуют пояснений. Мы хотим использовать MODE_APPEND, когда нам нужно добавить данные в конец файла, иначе мы будем перезаписывать файл каждый раз, когда пишем в него.

Но где именно этот внутренний файл сохраняется? Если мы действительно хотим знать, его абсолютный путь возвращается
вызовом метода ContextFilesDir () . Другой метод Context, 
fileList () , вернет массив всех файлов, сохраненных нашим приложением.

Эти внутренние файлы, конечно, удаляются, как только наше приложение удаляется пользователем. Но на случай, если мы сами захотим удалить внутренний файл в ходе рабочего процесса нашего приложения, для этой цели всегда есть
метод ContextFileFile () .

Как мы видим, API внутреннего файлового хранилища предоставляется
 классом
Context , который в основном обеспечивает доступ к среде нашего приложения.

Из
блога Тони .