栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

android 应用储存空间读写

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

android 应用储存空间读写


目录
  • 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()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/336630.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号