Android内部和外部存储解析

Android的开发离不开数据的存储,然后在之前的开发中一直没有搞清楚,是应该要好好梳理梳理了。

以下引用来自对官方文档的理解

安卓手机的存储分为 2 部分,内部存储 ( Internal ) 和外部存储
( External )

内部存储指的是系统存储空间,需要root权限才能访问,像SharedPreferenced和DataBase的数据都是保存在这里面

外部存储分为两部分
1.机器自带的存储,也就是常说的16G,32G,64G
2.SD卡(TF卡)

详细分析

Ram,Rom,以及扩展存储(TF卡)的区别;内部存储,外部存储的区别

对比图片
4.4以前,内置存储就是内部存储,外置SD卡就是外置存储。我们通过getDataDirectory()就可以获取内置存储根路径,通过getExternalStorageDirectory()就可以获取外置SD卡根路径。
4.4以后外部存储就包含两部分了,其中通过getExternalStorageDirectory获取的是机身存储的外部存储,而外置SD卡我们则需要通过getExternalFilesDir()遍历来获取了。

一、Internal Storage(内部存储)

空间很小,所以应该正确的使用它,因此用于保存一些重要的数据库文件以及一些用户的配置文件。
内部存储的路径:/data/data/0/packagename/files

files目录

getFileDir()

/data/data/packageName/files/

内部缓存目录

getCacheDir()

/data/data/packageName/cache/

配置文件

getDir(“fileName.txt”,Context.MODE_PRIVATE)

/data/data/packageName/app_fileName.txt
app_是系统自己加上去的

二、External Storage(外部存储)

概念

最容易混淆的是外部存储,因为老的Android系统的跟新的Android系统是有差别的,很多人去网上查找资料,看了一下以前的资料,又看了一下现在的资料,但是发现它们说法不一样然后就困惑了。首先说一个大家普遍的概念“如果在pc机上是区分外部存储和内部存储的话,那么电脑自带的硬盘算是内部存储,U盘或者移动硬盘就是外部存储了。”因此很多人带着这样的理解去看待安卓手机,把内置存储(机身存储)当做内部存储,而把扩展的SD卡当做是外部存储。这么认为确实没错,因为在4.4(API19)以前的手机上确实是这样的,手机自身带的存储卡就是内部存储,而扩展的SD卡就是外部存储。但是从4.4的系统开始,很多的中高端机器都将自己的机身存储扩展到了8G以上,比如有的人的手机是16G的,有的人的手机是32G的,但是这个16G,32G是内部存储吗,不是的!!!,它们依然是外部存储,也就是说4.4系统及以上的手机将机身存储存储(手机自身带的存储叫做机身存储)在概念上分成了”内部存储internal” 和”外部存储external” 两部分。既然16G,32G是外部存储,那有人又有疑惑了,那4.4系统及以上的手机要是插了SD卡呢,SD卡又是什么呢,如果SD卡也是外部存储的话,那怎么区分机身存储的外部存储跟SD卡的外部存储呢?对,SD卡也是外部存储,那怎么区分呢,在4.4以后的系统中,API提供了这样一个方法来遍历手机的外部存储路径

File[] files;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
    for(File file:files){
        Log.e("main",file);
    }
}

操作外部存储必须的权限(当你申请了write权限,那么read权限默认也就通过啦)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

状态判断

if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState)){
	//SD卡已挂载
}

而外部存储又分为公有目录和私有目录

1.外部存储公有目录

当我们删除应用之后,还应该保留在手机上的数据,例如拍照的照片,不应该随着删除应用而被删除掉。对于这类文件,Android给我们提供了特定的目录,这些目录都是以DIRECTORY开头的,例如:DIRECTORY_MUSIC , DIRECTORY_PICTURES.

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
/storage/emulated/0/Pictures

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
/storage/emulated/0/Music

外部存储的根目录

Environment.getExternalStorageDirectory()

/storage/emulated/0

2.外部存储私有目录

Android 4.4以后访问该目录不再需要权限

files目录

getExternalFilesDir(String type)

/storage/emulated/0/Android/data/<包名>/files/

缓存目录

getExternalCacheDir()

/storage/emulated/0/Android/data/<包名>/cache

三、/storage/sdcard,/sdcard,/mnt/sdcard,/storage/emulated/0之间的关系

系统版本结果
4.0/mnt/sdcard
4.1/storage/sdcard0
4.2/storage/sdcard0
4.4/storage/emulated/0
6.0/storage/emulated/0
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值