目录
- 1. 外部储存空间(无需权限)
- 2. 内部储存空间(无需权限)
1. 外部储存空间(无需权限)
使用外部储存空间,需要先验证可访问性(是否可读写)
- 持久文件夹路径
// /storage/emulated/0/Android/data/package/files/Pictures
// 传 null 得到根目录
val dir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
if(dir == null) {
// 爆出异常 或 切换到内部储存空间
}
- 缓存文件夹路径
// /storage/emulated/0/Android/data/package/cache
val dir = Content.getExternalCacheDir()
if(dir == null) {
// 爆出异常 或 切换到内部储存空间
}
- 是否可读
// 可读写 或 仅可读
fun isExternalStorageReadable(): Boolean {
return Environment.getExternalStorageState() in setOf(Environment.MEDIA_MOUNTED, Environment.MEDIA_MOUNTED_READ_ONLY)
}
- 是否可写
// 可读写
fun isExternalStorageWritable(): Boolean {
return Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED
}
- 读取文件(持久文件夹 和 缓存文件夹)
// 外部储存空间是否可读
if(!isExternalStorageReadable()) {
// 爆出异常 或 切换到内部储存空间
}
val parentDir = ....
val flie = File(parentDir, name)
- 写入及创建文件(持久文件夹 和 缓存文件夹)
// 外部储存空间是否可写
if(!isExternalStorageWritable()) {
// 爆出异常 或 切换到内部储存空间
}
val parentDir = ....
val file = File(parentDir, name)
file.outputStream().use {
it.write("Hello world!".toByteArray())
}
- 删除缓存文件
externalCacheFile.delete()
- 创建目录
val dir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), albumName)
if (!dir.exists() && dir.mkdirs()) {
// 初次创建目录,且失败
}
- 可用空间
// 需要消费的空间大小 const val NUM_BYTES_NEEDED_FOR_MY_APP = 1024 * 1024 * 10L; // 获取指定储存券的可用空间 val storageManager = applicationContext.getSystemService()!! val appSpecificInternalDirUuid: UUID = storageManager.getUuidForPath(filesDir) val availableBytes: Long = storageManager.getAllocatableBytes(appSpecificInternalDirUuid) if (availableBytes >= NUM_BYTES_NEEDED_FOR_MY_APP) { // 占据空间 storageManager.allocateBytes( appSpecificInternalDirUuid, NUM_BYTES_NEEDED_FOR_MY_APP) } else { val storageIntent = Intent().apply { action = ACTION_MANAGE_STORAGE } // 向用户显示空间不足提示 }
储存文件前也可以不判断空间是否不足,而是捕捉 IOException 错误
例如,在保存文件前更改文件的编码(将 PNG 图片转换为 JPEG 格式),无法得知文件的大小。
- 多个外部储存券
val externalStorageVolumes: Array= ContextCompat.getExternalFilesDirs(applicationContext, null) val primaryExternalStorage = externalStorageVolumes[0]
2. 内部储存空间(无需权限)
- 持久文件夹路径
// /data/data/package/files val dir = Content.getFilesDir()
- 缓存文件夹路径
// /data/data/package/cache val dir = Content.getCacheDir()
- 快捷写入文件(持久文件夹)
context.openFileOutput(fileName,Context.MODE_PRIVATE).use {
it.write("Hello world!".toByteArray())
}
- 快捷读取文件(持久文件夹)
context.openFileInput(name).bufferedReader().useLines { lines ->
lines.fold("") { some, text ->
"$somen$text"
}
}
- 快捷读取所有文件名(持久文件夹)
var files: Array= context.fileList()
- 创建 或 打开 文件夹(持久文件夹内嵌套文件夹)
val file = context.getDir(parentDir, Context.MODE_PRIVATE)
if (flie.isDirectory) {
flie.listFiles()
}
- 创建缓存文件
File.createTempFile("前置", "后缀可以空", context.cacheDir)
- 读取缓存文件
val cacheFile = File(context.cacheDir, name)
if (cacheFile.exists()) {
// 读取前,先确定缓存文件是否存在
}
- 删除缓存文件
context.deleteFile(cacheFileName) or cacheFile.delete()



