Android-內部存儲和外部存儲
學習自
https://blog.csdn.net/u012702547/article/details/50269639
https://blog.csdn.net/u010937230/article/details/73303034
https://developer.android.com/guide/topics/data/data-storage#filesExternal
內存,內部存儲,外部存儲,概念的區分
隨着Android的發展,這個幾個名詞真的是越來越見了鬼了,想起來就是頭疼,首先呢,我們要把這些概念搞清楚。
內存(Memory/RAM): 本來這個名詞的英語是不會產生歧義的,但是因為兩個語言之間的翻譯的問題,在加上很多人喜歡將 內部存儲(Internal Storage)
簡稱為 內存
😢。 因此就很容就造成干擾。 簡單的來說 RAM 是一種臨時的數據存儲器,當斷電后數據就會消失,並且讀取和寫入的速度非常快。通常我們所說的手機的運行內存就是它了(關於更專業的解釋可以交給度娘)。對於這個名詞我更喜歡稱之為 Memory
而不是“內存”以免造成意義上的混淆 😄。
內部存儲(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系統的生態需要我們自己來維護,與諸君共勉 😄。
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卡指指定類型的目錄 |