Зберігання файлів в android, російська документація android
Об'єкт типу File відмінно підходить для читання і запису великих обсягів даних, від початку до кінця. Це можуть бути наприклад картинки або інші файли, передані по мережі.
Зараз ми розглянемо виконання базових операцій, пов'язаних з використанням файлів в вашому додатку. Ми припускаємо, що ви вже знайомі з базовими можливостями файлової системою Linux, а також з API введення / виведення java.io
Вибір між внутрішнім і зовнішнім сховищем
Всі пристрої під Android мають два простору для зберігання файлів: зовнішнє і внутрішнє сховища. Ці назви залишилися від перших пристроїв на Android. На більшості пристроїв застосовувалася енергозалежна пам'ять (внутрішнє сховище) і знімні пристрої, на зразок microSD карт (зовнішнє сховище). Залежно від телефону, постійне місце зберігання ділиться між внутрішнім і зовнішнім розділами, тому навіть без SD карт у нас буде і "внутрішнє" і "зовнішнє" простір. При цьому для API неважливо розташовується чи зовнішній простір на знімному пристрої чи ні. У списку наведені загальні факти про обох типах простору:
Порада: хоча додатки встановлюються за замовчуванням на карту пам'яті, ви можете задати місце зберігання за допомогою атрибута android: installLocation в файлі маніфесту. Користувачам сподобається, що ви подбали про них і встановили цю опцію, у випадках, коли розмір файлу APK вашого додатка буде більше вільного простору їх внутрішнього сховища. Більше інформації про даної опції дивіться в розділі Місце установки програми.
Отримання прав для зовнішнього сховища
Для запису у зовнішнє сховище, ви повинні запитати права WRITE_EXTERNAL_STORAGE в файлі маніфесту:
Однак якщо ваше додаток використовує право на запис WRITE_EXTERNAL_STORAGE. права на читання будуть неявно задані.
Вам не потрібно отримувати будь-які додаткові дозволи для збереження файлів у внутрішньому сховищі. Додатки завжди мають права на запис і читання з директорій внутрішнього сховища.
Збереження файлів у внутрішньому сховищі
При збереженні файлів у внутрішньому сховищі, можна отримати відповідну директорію як об'єкт типу File. викликавши один з методів:
getFilesDir () Повертає об'єкт типу File представляє директорію внутрішнього сховища для вашого застосування. getCacheDir () Повертає об'єкт типу File представляє директорію внутрішнього сховища для зберігання тимчасових кеш файлів. Обов'язково видаляйте всі файли, як тільки ви перестаєте в них потребу і встановіть розумне обмеження на кількість пам'яті, яке ви використовуєте в певний момент часу, наприклад 1Мб. Якщо в системі залишиться мало місця для зберігання, вона може видалити ваші тимчасові файли без попередження.
Щоб створити новий файл в одній з директорій, ви можете використовувати конструктор File (). передавши в нього об'єкт типу File, отриманий за допомогою відповідного методу:
Збереження файлів у зовнішньому сховищі
Якщо жодне із зумовлених імен каталогів не підходить, ви можете в метод getExternalFilesDir () передати null. Метод поверне кореневої приватний каталог вашої програми, розташований в зовнішньому сховищі.
Пам'ятайте, що getExternalFilesDir () створює каталоги всередині директорії, яка буде видалена разом з додатком. Якщо файли повинні бути доступні після видалення програми, наприклад знімки з камери, використовуйте метод getExternalStoragePublicDirectory ().
Дуже важливо використовувати імена директорій, представлених константами API, такі як DIRECTORY_PICTURES незалежно від того, чи використовувався метод getExternalFilesDir () або getExternalStoragePublicDirectory (). Зумовлені імена директорій дозволяють системі правильно обробляти ваші файли. Наприклад, файли збережені в директорії DIRECTORY_RINGTONES будуть позначені системним медіа-сканером як мелодія дзвінка, а не як музичні файли.
Запит вільного простору
Якщо ви заздалегідь знаєте як багато даних вам треба зберегти, ви можете дізнатися чи достатньо місця, не чекаючи виключення IOException. за допомогою методів getFreeSpace () або getTotalSpace (). Дані методи дозволяють дізнатися кількість вільного і загального простору на розділі сховища, відповідно. Дана інформація також корисна, щоб уникнути заповнення розділу сховища вище певного порогу.
Однак система не гарантує, що ви можете записати стільки ж, скільки показує метод getFreeSpace (). Якщо вільного місця трохи більше, ніж ви хочете зберегти, або якщо файлова система заповнена менше, ніж на 90%, ймовірно можете продовжувати, інакше краще утриматися.
Примітка: вам не обов'язково перевіряти кількість вільного місця перед записом вашого файлу. Ви можете спробувати записати файл і обробити виняток IOException. Ви також можете не знати точно скільки місця вам потрібно. Наприклад, якщо ви міняєте кодування файлу перед збереженням, наприклад конвертуєте PNG в JPEG, ви можете не знати кінцевого розміру файлу.
видалення файлу
Завжди робіть це, якщо вони більше не використовуються. Найпростіший спосіб видалити відкритий файл - викликати для нього метод delete ():