美文网首页Android开发经验谈Android技术知识Android开发
Android程序员必看!Android内部和外部存储解析

Android程序员必看!Android内部和外部存储解析

作者: Android架构师丨小熊 | 来源:发表于2019-09-28 21:43 被阅读0次

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

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

一、外部存储分为两部分

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

二、详细分析

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

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

三、Internal Storage(内部存储)

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

1.files目录

getFileDir()

/data/data/packageName/files/

2.内部缓存目录
getCacheDir()

/data/data/packageName/cache/

3.配置文件
getDir(“fileName.txt”,Context.MODE_PRIVATE)

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

四、External Storage(外部存储)

1.概念
最容易混淆的是外部存储,因为老的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卡已挂载
}

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

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

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

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

3.外部存储的根目录
Environment.getExternalStorageDirectory()

/storage/emulated/0

4.外部存储私有目录
Android 4.4以后访问该目录不再需要权限

5.files目录
getExternalFilesDir(String type)

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

6.缓存目录
getExternalCacheDir()

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

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

最后

如果你看到了这里,觉得文章写得不错就给个赞呗!欢迎大家评论讨论!如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足,定期免费分享技术干货。感兴趣的小伙伴可以点一下关注哦。谢谢!

相关文章

网友评论

    本文标题:Android程序员必看!Android内部和外部存储解析

    本文链接:https://www.haomeiwen.com/subject/hontpctx.html