Android-內部儲存和外部儲存

魯迅認識的那隻猹發表於2018-09-04

Android-內部儲存和外部儲存

學習自

blog.csdn.net/u012702547/… blog.csdn.net/u010937230/… developer.android.com/guide/topic…

記憶體,內部儲存,外部儲存,概念的區分

隨著Android的發展,這個幾個名詞真的是越來越見了鬼了,想起來就是頭疼,首先呢,我們要把這些概念搞清楚。

記憶體(Memory/RAM): 本來這個名詞的英語是不會產生歧義的,但是因為兩個語言之間的翻譯的問題,在加上很多人喜歡將 內部儲存(Internal Storage) 簡稱為 記憶體 :cry:。 因此就很容就造成干擾。 簡單的來說 RAM 是一種臨時的資料儲存器,當斷電後資料就會消失,並且讀取和寫入的速度非常快。通常我們所說的手機的執行記憶體就是它了(關於更專業的解釋可以交給度娘)。對於這個名詞我更喜歡稱之為 Memory 而不是“記憶體”以免造成意義上的混淆 :smile:。

內部儲存(Internal Storage) 和 外部儲存(External Storage) 可以分別從 物理邏輯 區分。

從物理角度來說,手機自帶的儲存空間就是內部儲存,外外接的儲存設定比如說 SD卡 就是外部儲存。

從邏輯意義上來說,data 目錄就是就是就是手機的內部儲存,而 mnt 或者 storage 目錄下的sdcard目錄就是外部儲存。如果是手機記憶體的外部儲存被稱為機身外部儲存,外接的SD卡則稱之為外部儲存。當然都稱兩者為外部儲存也沒關係。在這裡還是希望大家能夠用英文來稱呼它們。

在原先的時候內部儲存和外部儲存是分開的,這種很好理解也很好區分(這種情況多發生Android4.4 及以前),但是隨著Android手機的發展,漸漸的都做成了一體機甚至將內部儲存和外部儲存都整合在了一起,只是在邏輯上區分了內部儲存和外部儲存。甚至到了現在很多廠商連外接SD卡的卡槽都不提供了。

下面的這一張圖希望可以幫助你理解:

InternalStorageAndExternalStorage

內部儲存中都放了哪些東西

InternalStorageContent

在代表Internal Storage的data 目錄下有兩個目錄是我們需要注意的。

  • app 目錄,是所有的已經安裝了的APP的 APK 的存放目錄。
  • data 目錄,是各個程式存放自己的私有的資料的地方比如郭 SharedPreferences Sqlite資料庫 快取檔案 等。在這些資料其他人都是無法訪問的,只有該APP的才能夠訪問。當然如果想將讓其他的APP可以訪問自己的APP的私有的資料,可以使用 ContentProvider 將想要公開的資料暴露出來,就像是我們所有的APP如果有相應的許可權的話,都可以讀取手機的聯絡人資訊一樣。同時當使用者解除安裝APP後data目錄下對應著APP的目錄頁會被刪除。當通過 【設定】中的【APP資訊資訊】中的選線也可以選擇清除data或者清除快取那麼,APP對應包名目錄下相應的資料就會被刪除。

PS: 除了data目錄,APP在外部儲存中同樣有一用來儲存私有的資料的地方,接下來會講到。

外部儲存中有哪些檔案

ExternalStorage

mnt下的sdcard就是我們的 External Storage了(根據不同的裝置也可能是storage目錄下的sdcard目錄),其中 Android 目錄需要我們特別注意。其中也有一個 data 目錄其下存在著非系統APP的對應的包名的目錄, 跟 Internal Storage 中data/data 目錄的作用相同。都是儲存一些私有的資料,相對於Internal Storage data/data/對應包名的目錄, 此目錄更適合儲存一些比較大的私有的媒體檔案,比如說 音樂,圖片等。 Android目錄也是一個私有儲存目錄。其他程式無權訪問。

大家都看到了上圖中除了 Android目錄外還有不少替他的目錄,這是都是共有儲存,只要有SD卡的操作許可權都可以讀取或者寫入。其中按照不同的檔案型別分了幾個不同的目錄比如說 Dlownload(下載的檔案應該存放到此目錄) Music(音樂應該存放到此目錄)等等。

PS: 雖然SD卡是共有的外部儲存,大家都可以訪問,但是如果可以的話,請將檔案按照不同的分類放到不同的目錄下,而不是自己在 sdcard 的根目錄下自己再建立一個目錄。 Android系統的生態需要我們自己來維護,與諸君共勉 :smile:。

Clear Data 和 Clear Catch

ClearDataAndClearCatch

這個介面大家應該都比較熟悉了吧,其中 CLEAR DATACLEAR CATCH 兩個按鈕應該是我們經常用的。

  • CLEAR DATA: 清除的是 data/data/對應程式包名 的資料夾下的所有的檔案全都會被刪除,mnt/sdcard/Android/對應程式包名 下的所有的資料也都會被刪除。
  • CLEAR CACHE: 清除的資料是 data/data/對應程式包名/catch 目錄下的資料,還有 mnt/sdcard/Android/對應程式包名/catch目錄下的資料

通過Context訪問程式的私有目錄

Context提供的路徑都有一個特點,都是當前App私有的,其他的App無許可權訪問。即這些目錄是當前應用程式的私有目錄。

方法 解釋
getFilesDir 獲取的 data/data/程式包名/files 這個目錄
getCatch 獲取的 data/data/程式包名/catch 這個目錄
getExternalCacheDir 獲取的是 mnt/sdcard/Android/程式包名/catch這個目錄
getExternalFilesDir(type:String) 獲取指定型別的檔案目錄位於 mnt/sdcard/Android/程式包名/files/<指定型別的目錄(例如 Downlaod))>
//create some files for testing
fun createSomeFiles(view: View) {
    File(this.filesDir, "tempFile.txt").writeText("Hello world")
    File(this.cacheDir, "tempCatch.txt").writeText("Hello internal catch")
    File(this.getExternalFilesDir(android.os.Environment.DIRECTORY_DOWNLOADS), "tempDownload.txt").writeText("Hello test")
    File(this.externalCacheDir, "externalCatch.txt").writeText("ExternalCatch.txt")
}
複製程式碼

通過Environment類訪問手機的公有目錄

通過Environment類獲取目錄是程式的公有目錄,因為是操作SD卡,所以在需要有讀寫SD卡的許可權,並且在Android 6.0 及以上的機器的時候,還需要動態申請許可權。

方法 解釋
Environment.getExternalStorageState() 獲取當前SD卡的狀態
Environment.getExternalStoragePublicDirectory(type:String) 獲取SD卡指指定型別的目錄

相關文章