Сохранить заметку на устройстве, записать результат игры или загрузить сохранённые настройки — всё это требует умения работать с файловой системой. В этом практическом уроке мы разберём, как в среде Android Studio с помощью языка Kotlin писать данные в файл и считывать их обратно. Использовать будем внутреннее хранилище приложения, доступное без дополнительных разрешений.
Где Android хранит файлы приложения
Каждое приложение получает свою изолированную папку, которую другие программы не видят. Она находится по пути /data/data/имя_пакета/files/ и доступна через свойство filesDir. Существует также кэш-директория (cacheDir) для временных данных, которые система может удалить при нехватке места. Сегодня мы будем работать с filesDir — основным хранилищем, куда можно класть заметки, JSON-файлы и любые другие данные.
Запись текста в файл
Начнём с самого простого: сохраним строку в текстовый файл. Метод openFileOutput открывает поток для записи во внутреннее хранилище. Первый параметр — имя файла, второй — режим. Обычно используется Context.MODE_PRIVATE, который перезаписывает файл, если он уже существует. Функция use гарантирует, что поток будет закрыт после завершения блока, даже если произойдёт ошибка.
fun saveNote(context: Context, filename: String, content: String) {
context.openFileOutput(filename, Context.MODE_PRIVATE).use { outputStream ->
outputStream.write(content.toByteArray())
}
}
Вызовите этот метод, передав имя файла (например, "note.txt") и текст, который нужно сохранить. Файл появится в папке filesDir, и его можно будет прочитать позже.
Чтение данных из файла
Для чтения используется парный метод openFileInput. Он открывает существующий файл и позволяет прочитать его содержимое. Проще всего преобразовать байты в строку с помощью функции readBytes().toString(Charsets.UTF_8).
fun loadNote(context: Context, filename: String): String {
return try {
context.openFileInput(filename).use { inputStream ->
String(inputStream.readBytes(), Charsets.UTF_8)
}
} catch (e: FileNotFoundException) {
"" // возвращаем пустую строку, если файла ещё нет
}
}
Обратите внимание на блок try-catch: при первом запуске файла не существует, и попытка его открыть вызовет исключение. Возвращая пустую строку, мы защищаем приложение от падения.
Список всех файлов и удаление
Иногда нужно показать пользователю список сохранённых заметок или очистить старые данные. Получить массив имён всех файлов в директории можно через fileList(), а удалить конкретный файл — через deleteFile().
val files: Array<String> = context.fileList()
for (file in files) {
println(file) // выводим имя каждого файла
}
// удаление файла
context.deleteFile("note.txt")
Обе операции не требуют разрешений и выполняются мгновенно. Если файла с указанным именем не существует, deleteFile просто ничего не сделает и не вызовет ошибку.
Практический пример: редактор заметки
Соберём всё вместе в компактное приложение. На экране будет поле ввода, две кнопки («Сохранить» и «Загрузить») и текстовое поле для отображения результата. При запуске активность проверяет, существует ли файл, и если да — сразу показывает сохранённый текст.
class NoteActivity : AppCompatActivity() {
private val filename = "my_note.txt"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_note)
val etInput = findViewById<EditText>(R.id.etInput)
val tvResult = findViewById<TextView>(R.id.tvResult)
val btnSave = findViewById<Button>(R.id.btnSave)
val btnLoad = findViewById<Button>(R.id.btnLoad)
// сразу загружаем сохранённую заметку
tvResult.text = loadNote(this, filename)
btnSave.setOnClickListener {
saveNote(this, filename, etInput.text.toString())
Toast.makeText(this, "Сохранено", Toast.LENGTH_SHORT).show()
}
btnLoad.setOnClickListener {
val savedText = loadNote(this, filename)
tvResult.text = savedText
if (savedText.isEmpty()) {
Toast.makeText(this, "Заметка пуста", Toast.LENGTH_SHORT).show()
}
}
}
}
Что важно запомнить
- Внутреннее хранилище не требует разрешений в манифесте и изолировано от других приложений.
- Методы openFileOutput и openFileInput — стандартный способ записи и чтения файлов в Android.
- Всегда обрабатывайте FileNotFoundException при чтении: файла может ещё не быть.
- Для больших объёмов данных используйте Room или SharedPreferences, а файловый ввод-вывод оставьте для текстовых заметок, JSON-файлов и кэша изображений.
Итог
Сегодняшний практикум в Android Studio показал, как использовать Kotlin для записи и чтения файлов во внутреннем хранилище. Вы написали функции сохранения и загрузки текста, научились получать список файлов и удалять ненужные данные. Эти базовые операции открывают дорогу к более сложным сценариям: экспорту данных, сохранению пользовательских настроек в JSON или кэшированию ответов сервера. Попробуйте прямо сейчас расширить пример — добавьте дату создания заметки и отображайте её рядом с заголовком.