Android 數據存儲知識梳理(2) Android存儲目錄

1、概述

對於Android系統中的存儲,通常分爲如下三個方面:android

  • 內部存儲
  • 外部存儲
  • 外部緩存目錄
  • 外部永久目錄
  • SD卡存儲

2、內部存儲

2.1 內部存儲的特色

內部存儲指的是下面這個路徑下的文件夾或者文件:數據庫

/data/data/應用包名/
複製代碼

截圖以下: 緩存

對於內部存儲來講,有這麼幾個特色:

  • 應用不須要聲明讀寫權限就能操做這個目錄下的文件夾或者文件
  • 通常狀況下,只有應用自己具備操做該目錄的權利
  • 當應用卸載以後,該目錄也會被刪除
  • 這部分目錄,普通用戶經過手機自帶的文件管理器是看不到的,除非使用Root Explorer等工具才能夠看到,而且要申請Root權限才能進行讀寫操做。

Android提供了一些方法來操做內部存儲的路徑,咱們能夠選擇它做爲咱們提供的標準目錄,也能夠本身建立目錄,下面咱們開始介紹。bash

2.2 標準文件目錄/data/data/應用包名/files

  • files目錄下建立、讀寫文件,能夠用下面這一對方法
public static void writeToPrivateFile(Context context, String str, String path) {
        FileOutputStream fileOutputStream = null;
        BufferedWriter bufferedWriter;
        try {
            fileOutputStream = context.openFileOutput(path, Context.MODE_APPEND);
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
            bufferedWriter.write(str);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileOutputStream != null) {
                    fileOutputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static String readFromPrivateFile(Context context, String path) {
        FileInputStream fileInputStream = null;
        BufferedReader bufferedReader;
        String result = null;
        try {
            fileInputStream = context.openFileInput(path);
            bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileInputStream != null) {
                    fileInputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return result != null ? result : "";
    }
複製代碼
  • files目錄下建立新的目錄 上面的方法是直接打開輸入輸出流,讀寫位於files根目錄下的文件,若是咱們但願進行更靈活的操做,那麼經過下面方法能夠得到files文件夾所指向的File對象,再經過這個返回的File對象操做:
File file = context.getFilesDir();
複製代碼
  • 列出files目錄下的全部文件名
String[] files = context.fileList();
複製代碼
  • 刪除files目錄下的文件
context.deleteFile(path);
複製代碼

2.3 標準緩存目錄data/data/應用包名/cache

files目錄相比,cache目錄有一個特色:就是當系統存儲空間不足時,會刪除其中的文件夾:app

File cacheFile = context.getCacheDir();
複製代碼

2.4 代碼緩存目錄data/data/應用/code_cache

它和上面cache目錄相似,都是隻能獲得一個File對象,一樣的,它也有一個特色,就是當App升級時,會刪除該目錄下的內容,這個API要求大於21工具

File code = context.getCodeCacheDir()
複製代碼

2.5 SharePreference和數據庫保存的目錄

在平時的開發中,咱們常常會用到SharePreference來保存數據,這些數據就位於:/data/data/應用包名/shared_prefs目錄下,而數據庫則保存在/data/data/應用包名/databases下。ui

2.6 根目錄

除了使用上面四種根目錄以外,咱們還能夠直接在data/data/應用包名目錄下新建目錄,調用下面的方法會咱們在/data/data/應用包名/目錄下新建一個名字爲app_<path>的文件夾,並返回這個文件夾的File對象,以後,咱們再經過這個對象進行相應的操做:spa

File dir = context.getDir(path, Context.MODE_APPEND);
複製代碼

3、外部存儲

這裏指的外部存儲是咱們平時常說的32g/64g,它是手機出廠時自帶的,不須要再額外的插入SD卡,它主要解決上面內部存儲的兩個問題:3d

  • 外部應用沒法訪問
  • 數據隨着應用數據被卸載而被刪除了

也就是下面截圖中部分的存儲: code

3.1 獨立於應用的外部存儲

這部分存儲的特色是:

  • 須要申請讀寫權限才能訪問
  • 任何有權限的應用均可以訪問它
  • 不會隨着應用的卸載而被刪除

因爲這部分的存儲和應用無關,所以它的方法都不是經過Context來調用,而是經過Environment的靜態方法來返回一個File對象,咱們再經過這個File對象進行操做。

  • getRootDirectory 返回是/system目錄,它和/sdcard以及/data是同級的.
  • getExternalStorageDirectory 返回的是外部存儲的根目錄,也就是咱們平時從文件管理器中能看到的最頂級目錄,它的File絕對路徑爲:/storage/emulated/0
  • getDownloadCacheDirectory 返回是/cache目錄,它和/system以及/data是同級的.
  • getExternalStoragePublicDirectory(String type) 其中,type的選項有以下幾種:
    最終獲得的文件夾管理器下面的幾個一級目錄,例如DIRECTORY_DCIM獲得的就是下面這個目錄:

3.2 和應用相關的外部存儲

這部分存儲的特色是:

  • 4.4之後不須要申請讀寫權限也能訪問
  • 隨着應用的卸載而被刪除
  • 該目錄能夠被其它應用訪問

這部分存儲的位置位於/Android/data/應用包名/下,例以下面這樣,就是com.android.browser的應用相關外部存儲:

  • getExternalCacheDir() 返回的是/Android/data/應用包名/cache目錄所對應的File對象
  • getExternalFilesDir(String type) typeEnvironment中定義的類型相同,根據type的不一樣返回不一樣的File對象,例如DIRECTORY_DCIM,那麼獲得的是/Android/data/應用包名/files/DCIM所對應的File對象。
相關文章
相關標籤/搜索