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卡的卡槽都不提供了。
下面的這一張圖希望可以幫助你理解:
內部儲存中都放了哪些東西
在代表Internal Storage的data
目錄下有兩個目錄是我們需要注意的。
- app 目錄,是所有的已經安裝了的APP的
APK
的存放目錄。 - data 目錄,是各個程式存放自己的私有的資料的地方比如郭
SharedPreferences
Sqlite資料庫
快取檔案
等。在這些資料其他人都是無法訪問的,只有該APP的才能夠訪問。當然如果想將讓其他的APP可以訪問自己的APP的私有的資料,可以使用ContentProvider
將想要公開的資料暴露出來,就像是我們所有的APP如果有相應的許可權的話,都可以讀取手機的聯絡人資訊一樣。同時當使用者解除安裝APP後data目錄下對應著APP的目錄頁會被刪除。當通過 【設定】中的【APP資訊資訊】中的選線也可以選擇清除data或者清除快取那麼,APP對應包名目錄下相應的資料就會被刪除。
PS: 除了data目錄,APP在外部儲存中同樣有一用來儲存私有的資料的地方,接下來會講到。
外部儲存中有哪些檔案
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
這個介面大家應該都比較熟悉了吧,其中 CLEAR DATA
和 CLEAR 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卡指指定型別的目錄 |