1. 程式人生 > 實用技巧 >Android開發學習程序 0.24 儲存機制

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