Приходилось ли работать с файлами при работе в приложении

Ответ

Да, работал с файлами в Android. Основные операции: чтение/запись во внутреннее и внешнее хранилище, работа с SharedPreferences, Assets и Raw ресурсами.

Пример записи во внутреннее хранилище:

val file = File(context.filesDir, "example.txt")
file.writeText("Hello, World!")

Для внешнего хранилища нужны разрешения (READ/WRITE_EXTERNAL_STORAGE) и проверка доступности:

if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
    val file = File(context.getExternalFilesDir(null), "external.txt")
    file.writeText("External data")
}

Для SharedPreferences:

val prefs = context.getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
prefs.edit().putString("key", "value").apply()

Важно учитывать ограничения Scoped Storage в Android 10+.

Ответ 18+ 🔞

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

Смотри, там в основном вся движуха крутится вокруг внутреннего хранилища, внешнего, этих ваших SharedPreferences, ну и ещё Assets с Raw ресурсами — там свои приколы.

Вот, например, если тебе надо что-то на внутреннюю память телефона записать — это относительно просто. Ты как бы в своей песочнице ковыряешься, и тебя особо не трогают. Делается это примерно так:

val file = File(context.filesDir, "example.txt")
file.writeText("Hello, World!")

Всё, приехали. Файлик example.txt создался где-то в недрах твоего приложения. Главное — context не потеряй, а то будешь как дурак искать, куда всё записалось.

А вот с внешним хранилищем — это уже ёперный театр начинается, особенно сейчас. Раньше-то было: взял разрешение в манифесте на READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE и пошёл писать везде, куда вздумается. А сейчас, блядь, с этой Scoped Storage в Android 10 и выше — просто пиздец. Тебе уже не дадут просто так похавать в корень SD-карты или в общие папки с фотками.

Сначала надо проверить, а доступно ли оно вообще, это внешнее хранилище. А то вдруг карточки нет или она только для чтения.

if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
    val file = File(context.getExternalFilesDir(null), "external.txt")
    file.writeText("External data")
}

Видишь? getExternalFilesDir(null). Это уже не та свобода, что раньше. Это твоя выделенная папка на внешней памяти. Для пользователя она выглядит как часть приложения. Хочешь в общую галерею фото сохранить? Готовься танцевать с MediaStore, чувак. Это отдельная история, там овердохуища кода.

Ну а SharedPreferences — это вообще святое, для мелочёвки. Пароли туда, правда, не пиши, а то будет тебе хиросима. Используется для настроек, всяких флажков, токенов (хотя токены лучше в EncryptedSharedPreferences).

val prefs = context.getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
prefs.edit().putString("key", "value").apply()

apply() — это асинхронно, быстро. commit() — синхронно, может главный поток подвесить, если часто вызывать. Не накосячь тут.

И главное, что я хочу сказать — запомни как отче наш: с Android 10 (API 29) началась эта долбанная Scoped Storage. Если таргет апишка у тебя 29 или выше, то старые способы работы с внешним хранилищем накрываются медным тазом. Система будет тебя ограничивать, как того самого мартышлюшку. Придётся использовать MediaStore, SAF (Storage Access Framework) или довольствоваться своим выделенным getExternalFilesDir(). Иначе пользователь увидит диалог «Разрешить доступ к мультимедиа?» и подумает: «Какого хуя этому калькулятору доступ к моим фоткам?».

Вот такая, блядь, песня. Вроде просто, а нюансов — хуй с горы.