1. Android數據存儲之File總結
在使用File存儲App數據時,我們需要了解Android系統的存儲系統。Android的存儲分為內部存儲和外部存儲。
由於Android系統的廠商比較多,對於外部存儲目錄的定義有所不滲纖同,可能在根目錄下的mnt,sdcard和storage下。以storage為例,打開emulated/0目錄,外部存儲目錄就出現了。雖然可以通過多種路徑打開外部存儲文件,但是最終他們的路徑是相同的:
mnt:
storage:
sdcard:
外部存儲目錄下包含兩大類:公有目錄和私有目錄
私有目錄:
對比下來External有以下幾點優點:
缺點:
內部存儲與外昌喊山部存儲許可權申請對比如下:
首先我們要獲取外部存儲目標文件的路徑:
然後確定自己需要創建的文件名,結合上面的到的路徑,創建一個File對象:
Android系統默認數據清理的路徑是,內部存儲目錄中相應的cache文件夾中的文件和外部存儲中相應的cache文件夾中的文件。
你的app的internal storage 目錄是以你的app的包名作為標識存放在Android文件系統的特定目錄下[data/data/com.example.xx]。 從技術上講,如果你設置文件為可讀的,那麼其他app就可以讀取你的internal文件。然而,其他app需要知道你的包名與文件名。若是你沒有設置為可讀或者可寫,其他app是沒有辦法讀寫的。因此只要你使用MODE_PRIVATE ,那麼這些文件就不可能被其他app所訪問。
另外記住一點,內部存儲在你的APP卸載的時候,會一塊被刪除,因此,我們可以在cache目錄裡面放置我們的圖片緩存,而且cache與files的差別在於,如果手機的內部存儲空間不夠了,會自行選擇cache目錄進行刪除,因此,不要把重要的文件放在cache文件裡面,可以放置在files裡面,因為這個文件只有在APP被卸載的時候才會被刪除。還有要注意的一點是,如果應用程序是更新操作,內部存儲不會被刪除,區別於被用戶手動卸載。
不管你是使用 () 來存儲可以共享的文件,還是使用 getExternalFilesDir() 來儲存那些對於你的app來說是私有的文件,有一點很重要,那就是你要使用那些類似DIRECTORY_PICTURES 的API的常量。那些目錄類型參數可以確保那些文件被系統正確的對待。例如,那些以DIRECTORY_RINGTONES 類型保存的文件就會被系統的耐中media scanner認為是ringtone而不是音樂。
在開發中,不建議往內部存儲中寫太多的數據,畢竟空間有限。外部存儲在使用的時候最好能夠將文件存放在私有目錄下,這樣有利於系統維護,也避免用戶的反感。
徹底理解android中的內部存儲與外部存儲
Android存儲挖坑記
緩存文件可以放在哪裡?它們各自的特點是什麼
2. 安卓手機USB存儲設備和SD卡有什麼區別
安卓手機USB存儲設備:機子內置的存儲卡手機默認是把應用安裝在系統內置的存儲卡的,所以無論你在手機上下載什麼和移動應用程序都是移動到系統內置的存儲卡!
3. 安卓手機里的內部存儲空間和內置存儲卡有何區別
內部存儲空間:其實叫RAM,是手機運行內存,當運行軟體或程序時要佔用的內存,這個越大越好非常重要,當然這是出廠就已經固定了容量,所以購買時多注意看看。
內置存儲卡:手機內部用於存儲系統ROM包,以及軟體,應用,文件,之類的存儲卡,功能其實跟外載存儲卡差不多,只不過已經植入主板,所以讀寫時明細要快很多叢含盯。
外老枯置存儲卡:也叫SD卡,用於存放軟體,應用,文件,相片之類的存儲卡,市面有賣,用戶可以自己直接選擇大小,以及自己安裝,只不過如果軟體安裝放在這個位置,對軟體滲和運行會有明顯的影響,所以一般只存放文件,相片,音樂之類的文件。
4. 安卓手機的「內部存儲空間」「內置存儲卡」「外置存儲卡」分別是什麼
您指的安卓手機「內部儲存空間」實際上就是手機內置的內存卡,相當於電腦元件中的硬碟,手機自身系統文件均安裝於此空間內,同時還承載其他文件、程序的儲存。
「外置存儲卡」也就是手機內州耐存卡,指的是手機擴展內存量,即手機內存卡TF/SD,如果比較電腦,可當缺鍵做其為U盤或移動硬碟。
「運行內存」,他主要是指手機運行程序時使用的內存,只能臨時存儲數據,用於與CPU交換高速緩存數據,但是隨機存儲器(RAM)本身不能用於長期存伏跡巧儲數據。他的空間大小決定系統操作流暢,軟體啟動速度,同時打開程序數量等等。
5. 安卓內部外部文件存儲
總述
覺得十分有必要搞清楚內存,內部存儲和外部存儲的區別,還有我們在開發中真正將數據存在了手機的哪兒。
先提一個問題:手機設置的應用管理中,每個App下都有清除數據和清除老配緩存,清除的分別是哪裡的數據?
一 內存,內部存儲和外部存儲
整個存儲空間分為內部存儲和外部存儲兩部分,內部存儲中又包含RAM和ROM等部分。
內部存儲,即InternalStorage,也常說內置存儲卡,這是手機內置的存儲空間,出廠時就被確定,是手機的一個硬體指標。類比電腦的內存。
外部存儲,即ExternalStorage,也常說外置存儲卡,手機出廠時並不存在,是由用戶自由擴展的存儲空間,常見的就是SD卡。類比電腦的外接移動硬碟。
RAM,即常說的運行時內存,是手機運行野宴時存儲數據和指令的地方,注意是運行時內存。類比電腦的內存條。
ROM,用來存放一些系統文件,應用配置和其他數據的地方,是內部存儲中主要存儲區域。類比於Windows電腦的C盤。
上圖中運行內存即RAM,共2G,機身存儲即內部存儲,共8G。
打開手機的文件管理,再點擊手機一項,可以看到下圖:
上圖中箭頭所指的地方,可以進行內部存儲與外部存儲的切換,當前頁為內部存儲下的展示,這只是Android系統存儲數據的一部分而已,大部分數據都對用戶隱藏。至於紅框部分下面繼續講。
二 詳說存儲
一般來說,App軟體大都安裝在內部存儲的ROM區,當然現在也有辦法安裝在SD卡上,但這需要App自身支持及SD卡分區等一系列操作,下面討論的App是安裝在ROM區的。
以Genymotion模擬器設備為例來分析,型號是三星GalaxyS5。直接使用AndroidStudio的DDMS,打開File Explorer,我們可以看到下圖:
這張圖是手機根目錄下的完整目錄結構圖,內外部存儲均包含在內。不過有些文件內容需要root許可權才能看到。
上面展示的內部存儲圖就是其中一部分子目錄。
選其中幾個重要的文件夾介紹。
2.1 /data包:主要存儲手機應用的相關數據。
如上圖的二級目錄中,/data/app文件夾下存放三方應用的apk文件;/data/data文件夾下存放系統應用和三方應用的包私有數據,每個應用都有獨屬於自己的包。
選一個三方應用包——com.X.main,來分析三級目錄——/data/data/com.X.main下都有什麼數據:
由包名不難看出:cache包存放緩存數據,侍脊指databases包存放使用SQLite存儲的數據,files包存放普通數據(log數據,json型數據等),shared_prefs包存放使用SharedPreference存放的數據。這些包都是由系統創建的。
2.2 /mnt/sdcard/storage包:這三個包,與手機的部分內置存儲卡數據和外置存儲卡數據有關。
上面的完整目錄結構圖中有其子目錄信息展示。
以內置存儲卡來說,通常用sdcard0表示:Android4.1上,首先掛載到目錄/storage/sdcard0上面,/sdcard和/mnt/sdcard都只是指向/storage/sdcard0的軟鏈接;Android4.2上,首先掛載到目錄/storage/emulated/0(0就表示內置存儲)上面,為兼容之前版本,又掛載到/storage/emulated/legency上面,/storage/sdcard0、/sdcard和/mnt/sdcard都只是指向/storage/emulated/legency的軟鏈接。(掛載相當於真正位置,軟鏈接相當於指針)。
/mnt/sdcard是Android2.2及之上版本使用,/sdcard是Android2.1及之下版本使用。
在手機的文件管理中看到的內置存儲卡文件,如上面文件管理頁面的圖,就是/storage/emulated /0包的子目錄,Android包的路徑就是:/storage/emulated/0/Android。
2.3 其他
/dev包:Linux系統的常規文件夾。
/system包:系統配置的文件夾,比如Android系統框架(framework)、底層類庫(lib)、字體(font)等。
三 存儲相關操作
在Android開發中,我們常打交道的存儲空間有三部分。
一是根目錄下路徑為 /data/data/包名/XX 的文件。開發中SQLite數據、SharedPreference數據均保存在這里,雖說我們可以讀寫操作,但這部分空間由系統維護。
二是在外置存儲卡上做存儲。暫時不講。
三是在內置存儲卡中做存儲。在/storage/emulated/0/Android/data包下或與/storage/emulated/0/Android包同級目錄上,建立App包存儲數據,這部分空間均由開發者維護。區別在於/storage/emulated/0/Android/data包下的數據為私有目錄數據,會隨App卸載被清除,與/storage/emulated/0/Android包同級的數據(如系統目錄DCIM包,DOWNLOWN包和bluetooth包,還有下圖中的包)屬於公有目錄數據,不會隨App卸載被清除,這就會造成數據的卸載殘留。
Google官方建議開發者將App的數據存儲在私有目錄即/storage/emulated/0/Android/data包下,這樣卸載App時數據會隨之被系統清除,不會造成數據殘留。
對存儲空間進行操作,首先要獲取存儲空間的存儲路徑,對此Android提供了Environment類和Context類來獲取路徑。
就上面對存儲空間的劃分,第一部分空間對用戶不可見,是在具體包名下的,和特定的App有關,所以對這些數據的訪問需調用Context類中的方法;第三部分空間對用戶可見,私有目錄數據仍與特定App有關,需調用Context類中的方法,而公有目錄數據與App無關,應調用Environment類中的方法。
總結如下圖:
寫了個小程序對Environment類和Context類相關方法測試,如下圖:(冒號前為方法名,冒號後為輸出結果)
四 回答最初提出的問題
手機設置的應用管理中,每個App下都有清除數據和清除緩存,清除的分別是哪裡的數據?
還是用上面的Genymotion模擬器設備來分析,主要測試三部分數據:
內部數據:/data/data/包名/XXX
外部私有數據:/storage/emulated/0/Android/data/包名/XXX
外部公有數據:/storage/emulated/0/包名/XXX
測試結果圖就不上了,直接上結論:
清除緩存:將外部私有數據下的cache包(/storage/emulated/0/Android/data/包名/cache)清除,將內部數據下的cache包下的內容(/data/data/包名/cache/XXX)清除 。
清楚數據:將外部私有數據包(/storage/emulated/0/Android/data/包名)清除,將內部數據下的所有內容(/data/data/包名/XXX)清除;
而兩種操作對外部公有數據均無影響。