轉自https://www.jianshu.com/p/0a18691e410ahtml
在android開發中咱們經常聽到這樣幾個概念,內存,內部存儲,外部存儲,不少人經常將這三個東西搞混,那麼咱們今天就先來詳細說說這三個東西是怎麼回事?
android
內存,咱們在英文中稱做memory,內部存儲,咱們稱爲InternalStorage,外部存儲咱們稱爲ExternalStorage,這在英文中本不會產生歧義,可是當咱們翻譯爲中文以後,前兩個都簡稱爲內存,因而,混了。數據庫
1.內部存儲:
編程
注意內部存儲不是內存。內部存儲位於系統中很特殊的一個位置,若是你想將文件存儲於內部存儲中,那麼文件默認只能被你的應用訪問到,且一個應用所建立的全部文件都在和應用包名相同的目錄下。也就是說應用建立於內部存儲的文件,與這個應用是關聯起來的。當一個應用卸載以後,內部存儲中的這些文件也被刪除。從技術上來說若是你在建立內部存儲文件的時候將文件屬性設置成可讀,其餘app可以訪問本身應用的數據,前提是他知道你這個應用的包名,若是一個文件的屬性是私有(private),那麼即便知道包名其餘應用也沒法訪問。內部存儲空間十分有限,於是顯得難得,另外,它也是系統自己和系統應用程序主要的數據存儲所在地,一旦內部存儲空間耗盡,手機也就沒法使用了。因此對於內部存儲空間,咱們要儘可能避免使用。Shared Preferences和SQLite數據庫都是存儲在內部存儲空間上的。內部存儲通常用Context來獲取和操做。api
2.外部存儲:
app
最容易混淆的是外部存儲,若是說pc上也要區分出外部存儲和內部存儲的話,那麼自帶的硬盤算是內部存儲,U盤或者移動硬盤算是外部存儲,所以咱們很容易帶着這樣的理解去看待安卓手機,認爲機身固有存儲是內部存儲,而擴展的T卡是外部存儲。好比咱們任務16GB版本的Nexus 4有16G的內部存儲,普通消費者能夠這樣理解,可是安卓的編程中不能,這16GB仍然是外部存儲。.net
全部的安卓設備都有外部存儲和內部存儲,這兩個名稱來源於安卓的早期設備,那個時候的設備內部存儲確實是固定的,而外部存儲確實是能夠像U盤同樣移動的。可是在後來的設備中,不少中高端機器都將本身的機身存儲擴展到了8G以上,他們將存儲在概念上分紅了"內部internal" 和"外部external" 兩部分,但其實都在手機內部。因此無論安卓手機是否有可移動的sdcard,他們老是有外部存儲和內部存儲。最關鍵的是,咱們都是經過相同的api來訪問可移動的sdcard或者手機自帶的存儲(外部存儲)。翻譯
外部存儲雖然概念上有點複雜,但也很好區分,你把手機鏈接電腦,能被電腦識別的部分就必定是外部存儲。3d
通常來講,咱們不會本身去操做內部存儲空間,沒有root權限的話,咱們也無法操做內部存儲空間,事實上內部存儲主要是由系統來維護的。不過在代碼中咱們是能夠訪問到這個文件夾的。因爲內部存儲空間有限,在開發中咱們通常都是操做外部存儲空間。cdn
Google官方建議咱們App的數據應該存儲在外部存儲的私有目錄中該App的包名下,這樣當用戶卸載掉App以後,相關的數據會一併刪除,若是你直接在/storage/sdcard目錄下建立了一個應用的文件夾,那麼當你刪除應用的時候,這個文件夾就不會被刪除。
一目瞭然,什麼是內部存儲,什麼是外部存儲。
若是按照路徑的特徵,咱們又能夠將文件存儲的路徑分爲兩大類,一類是路徑中含有包名的,一類是路徑中不含有包名的,含有包名的路徑,由於和某個App有關,因此對這些文件夾的訪問都是調用Context裏邊的方法,而不含有包名的路徑,和某一個App無關,咱們能夠經過Environment中的方法來訪問。以下圖:
你們看到,有包名的路徑咱們都是調用Context中的方法來得到,沒有包名的路徑,咱們直接調用Environment中的方法得到,那麼其中有兩個方法須要傳入一個String類型的參數,這個參數咱們使用了Environment中的常量,參數的意思是咱們要訪問這個路徑下的哪一個文件夾。
說到這裏,我想你們對內部存儲、外部存儲該有了一個清晰的認識了吧。咱們在開發中,不建議往內部存儲中寫太多的數據,畢竟空間有限。外部存儲在使用的時候最好可以將文件存放在私有目錄下,這樣有利於系統維護,也避免用戶的反感。
當咱們點擊清除數據的時候清除的是哪裏的數據呢?毫無疑問,固然是內部存儲目錄中相應的files和cache文件夾中的文件和外部存儲中相應的files和cache文件夾中的文件,至於這些文件夾的路徑我想你應該已經明白了。
本文摘自: