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

  • 相关阅读:
    JDBC 复习4 批量执行SQL
    JDBC 复习3 存取Oracle大数据 clob blob
    Oracle复习
    Linux命令(1)grep
    JDBC 复习2 存取mysql 大数据
    JDBC 复习1 DBUtil
    php 环境搭建问题
    Windows 批处理 bat 开启 WiFi 菜单选项 设置ID PWD
    Bat 批处理启动和停止Oracle 服务
    docker 学习1 WSL docker ,Windows docker
  • 原文地址:https://www.cnblogs.com/baimiyishu/p/13878154.html
Copyright © 2011-2022 走看看