zoukankan      html  css  js  c++  java
  • Android开发学习进程 0.24 存储机制

    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() = /cache
    Environment.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

  • 相关阅读:
    魔法跳舞链 51Nod
    反射
    JDBC---后端服务器与数据库交互的桥梁
    多线程
    IO流
    继承与重写
    java.util包
    多态
    Java.lang包
    异常
  • 原文地址:https://www.cnblogs.com/baimiyishu/p/13878154.html
Copyright © 2011-2022 走看看