美文网首页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