
Android开发学习进程 0.24 存储机制
发布日期:2021-05-09 00:48:50
浏览次数:16
分类:博客文章
本文共 3103 字,大约阅读时间需要 10 分钟。
Android 的存储机制
Android存储机制较混乱,早期安卓设备均带有SD卡插槽,即存储分为内部存储和外部存储,(注:此内部存储应与内存即主存区分)但现在大部分手机均不支持SD卡,同时系统ROM自动将手机存储空间划分为 内部存储和外部存储,所以即使现在手机没有内存卡,但还是可以区分内部存储和外部存储。
内部存储存储的数据均在包名文件夹下,默认仅有你的应用可以访问,但可以设置文件访问可读,供其他应用访问。SP 和SQLite都存储在这里,访问方法有:1、Environment.getDataDirectory()2、getFilesDir().getAbsolutePath()3、getCacheDir().getAbsolutePath()4、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath()外部存储在4.4后有所不同,许多手机已经集成了外部存储,但在系统中也会区分内外部存储,如果手机本身区分自带内外部存储,但还插入SD卡后,获取的外部存储会有两条!如果使用以下方式遍历File[] files;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { files = getExternalFilesDirs(Environment.MEDIA_MOUNTED); for(File file:files){ Log.e("main",file); }}
可看到两条路径,外部存储获取方法有:
1、Environment.getExternalStorageDirectory().getAbsolutePath()2、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath()3、getExternalFilesDir(“”).getAbsolutePath()4、getExternalCacheDir().getAbsolutePath()即/data目录下的文件物理上存放在内部存储里面
/storage目录下的文件物理上存放在外部存储里面/system用于存放系统文件,/cache用于存放一些缓存文件,物理上它们也是存放在内部存储里面的其他不同获取路径方法:1、Environment.getDataDirectory() = /data这个方法是获取内部存储的根路径2、getFilesDir().getAbsolutePath() = /data/user/0/packname/files这个方法是获取某个应用在内部存储中的files路径3、getCacheDir().getAbsolutePath() = /data/user/0/packname/cache这个方法是获取某个应用在内部存储中的cache路径4、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath() = /data/user/0/packname/app_myFile这个方法是获取某个应用在内部存储中的自定义路径方法2,3,4的路径中都带有包名,说明他们是属于某个应用…………………………………………………………………………………………5、Environment.getExternalStorageDirectory().getAbsolutePath() = /storage/emulated/0这个方法是获取外部存储的根路径6、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath() = /storage/emulated/0这个方法是获取外部存储的根路径7、getExternalFilesDir(“”).getAbsolutePath() = /storage/emulated/0/Android/data/packname/files这个方法是获取某个应用在外部存储中的files路径8、getExternalCacheDir().getAbsolutePath() = /storage/emulated/0/Android/data/packname/cache这个方法是获取某个应用在外部存储中的cache路径方法7、8在Android4.4以上才有用,4.4以下当未插入SD卡时可能会返回null。6.0以上使用getExternalFilesDirs在有内存卡的条件下获取内存卡路径。Environment.getDownloadCacheDirectory() = /cacheEnvironment.getRootDirectory() = /system这两个方法通用同时注意getFilesDir().getAbsolutePath()和getExternalFilesDir(“”).getAbsolutePath()的不同在于一个获取的是内部存储地址,另一个是外部存储,同时都带有包名,这意味着删除应用后这些文件也将被删除。应当优先使用外部存储,但是为做好适配需要做判断,在无法使用外部存储时使用内部存储。代码如下:public static String getFilePath(Context context,String dir) { String directoryPath=""; if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ) {//判断外部存储是否可用 directoryPath =context.getExternalFilesDir(dir).getAbsolutePath(); }else{//没外部存储就使用内部存储 directoryPath=context.getFilesDir()+File.separator+dir; } File file = new File(directoryPath); if(!file.exists()){//判断文件目录是否存在 file.mkdirs(); } return directoryPath;}
而在低版本Android 4.0 4.1 4.2中 获取外部存储的文件路径不一,设计Linux的文件挂载,不同用户的文件,作者也没有搞清楚,所以为统一适配,尽量不直接使用文件路径访问。
设置中清除缓存和清除数据
在手机应用管理中,有清除缓存和清除数据这两个按钮,但其与内部存储中/data/user/0/packname/cache 和/data/user/0/packname/files并没有关系,清除缓存是清除app运行过程中读入写入或其他的一些临时数据,
而清除数据则会把内部存储的/data/user/0/packname/以及外部存储的包名下专属存储全部删除。包括cache files sp等。文章部分资料参考https://blog.csdn.net/s13383754499/article/details/82910704
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月16日 18时10分31秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Echarts笔记
2019-03-22
Ubuntu 20.04 Docker 安装并配置
2019-03-22
[小技巧]新建txt菜单
2019-03-22
【问答23】Linux移植:如何制作rootfs?
2019-03-22
Java虚拟机详解(五)------JVM参数(持续更新)
2019-03-22
在 eclipse 中将 web 项目部署到 tomcat 服务器上
2019-03-22
ffmpeg结构体(3)-之AVPacket及其相关函数
2019-03-22
iOS关于申请公司开发者账号缴费支付
2019-03-22
寻找两个有序数组的中位数
2019-03-22
10-3 A1-4在产品表中找出库存数量大于50的产品的信息 (20 分)
2019-03-22
配置文件中有“路径信息”时,需呀注意的问题(路径中的\是转义字符)~
2019-03-23
桜の木になろう
2019-03-23
Python 读取16进制byte数据
2019-03-23
Python 存储和读取ASCII码形式的byte数据
2019-03-23
Ajax学习笔记-错误的处理-7
2019-03-23
微信小程序跳转微信小程序的实现
2019-03-23
SparkStreaming利用队列生成测试数据源
2019-03-23
简单三步VisualVm远程监控Java进程
2019-03-23
js——BOM操作知多少?
2019-03-23