一、文件存储实战:私有空间的安全操作
1. 内部存储文件操作
基础API使用
val internalFilesDir: File = context.filesDir // /data/data/<pkg>/files
// 写入文件
val fileName = "app_config.json"
context.openFileOutput(fileName, Context.MODE_PRIVATE).use { stream ->
stream.write(configJson.toByteArray())
}
context.openFileInput(fileName).use { stream ->
val content = stream.bufferedReader().readText()
}
val fileList = context.fileList()
缓存文件管理
File cacheDir = context.getCacheDir();
File tempFile = File.createTempFile("temp_", ".tmp", cacheDir);
fun calculateCacheSize(context: Context): Long {
return context.cacheDir.walkTopDown().fold(0L) { acc, file ->
acc + file.length()
}
}
fun clearCache(context: Context) {
context.cacheDir.deleteRecursively()
context.cacheDir.mkdirs()
}
2. 应用专属外部存储操作

代码实现
val pictureDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
val mediaDirs = context.getExternalMediaDirs()
val mediaDir = mediaDirs.firstOrNull()?.apply { mkdirs() }
fun saveImageToExternal(bitmap: Bitmap, fileName: String) {
val imagesDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
val imageFile = File(imagesDir, fileName)
FileOutputStream(imageFile).use { out ->
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out)
}
MediaScannerConnection.scanFile(context, arrayOf(imageFile.path), null, null)
}
目录结构示例
/storage/emulated/0/
├── Android/
│ ├── data/
│ │ └── com.example.app/
│ │ ├── cache/
│ │ ├── files/
│ │ │ ├── Documents/
│ │ │ ├── Pictures/
│ │ │ └── Audio/
│ │ └── ...
│ └── media/
│ └── com.example.app/
│ ├── Images/
│ └── Videos/
3. 文件操作通用实践
viewModelScope.launch(Dispatchers.IO) {
saveLargeFile(data)
}
FileInputStream(file).use { stream ->
}
BufferedInputStream(FileInputStream(file)).use { bis ->
}
try {
} catch (e: IOException) {
when {
e is FileNotFoundException -> handleFileNotFound()
e.message?.contains("ENOSPC") == true -> showStorageFullError()
else -> handleGenericError(e)
}
}