Android-內部存儲和外部存儲


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卡的卡槽都不提供了。

下面的這一張圖希望可以幫助你理解:
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系統的生態需要我們自己來維護,與諸君共勉 😄。

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卡指指定類型的目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM