Android的文件存儲分爲內部存儲和外部存儲
1.內部存儲位於一個很特殊的位置,在內部存儲中的文件只能被自己的應用訪問到,每個應用的文件和數據都存儲在內部存儲中與自己應用包名相同的文件目錄中。
2.當應用卸載後,其位於內部存儲中的數據就被清除了。
3.app直接可以互相訪問對方在內部存儲中的數據,前提是要直到對方app的完整包名。
4.內部存儲是系統本身和系統應用存儲數據的重要位置,一旦內部存儲用盡,系統就無法使用了。
5.內部存儲一般用Context來獲取和訪問
6.獲取內部存儲的路徑的方法
Environment.getDataDirectory() //獲取內部存儲的根路徑
Context.gitFilesDir().getAbsolutePath() //獲取某個應用在內部存儲中的files路徑
Context.getCacheDir().getAbsolutePath() //獲取某個應用在內部存儲中的cache路徑
Context.getDir("myFile", MODE_PRIVATE).getAbsolutePath() //獲取某個應用在內部存儲中的自定義路徑
7.外部存儲在4.4版本的android系統之前和系統之後的定義是有較大區別的
4.4版本之前的android系統將手機出廠自帶的存儲卡作爲內部存儲,而將插入的SD卡作爲外部存儲
4.4版本之後的android系統則不是這樣區分的,因爲內置的存儲卡現在容量越來越大,因此,4.4版本以後的外部存儲一部分在內部的存儲卡上,然後包括外部插入的存儲卡
如果使用getExternalFilesDirs函數可以獲取一個或者多個外部存儲路徑,例如:
/storage/emulated/0/Android/data/packname/files/mounted
/storage/B3E4-1711/Android/data/packname/files/mounted
那麼,/storage/emulated就是內部存儲卡上作爲外部存儲的部分,而/storage/B3E4-1711則是外部SD卡在文件系統中的掛載點。
前者成爲主要外部存儲,後者成爲次要外部存儲,這兩部分統稱外部存儲。
8.獲取外部存儲的路徑的方法
Environment.getExternalStorageDirectory().getAbsolutePath() //獲取外部存儲的根路徑
Environment.getExternalStoragePublicDirectory("").getAbsolutePath() //獲取外部存儲的根路徑
Context.getExternalFilesDir("").getAbsolutePath() //獲取某個應用在外部存儲的files路徑
Context.getExternalCacheDir("").getAbsolutePath() //獲取某個應用在外部存儲的cache路徑
9.函數如何區分機器自帶存儲卡上的外部存儲和實際SD卡的外部存儲
getExternalFilesDir和getExternalCacheDir函數的參數,如果是Environment.MEDIA_MOUNTED表示是SD卡,爲空函數表示是機身自帶存儲中的外部存儲。
10.訪問權限
4.4以後的系統對於訪問外部存儲沒有權限限制(需要代碼驗證)
11.便攜式存儲設備
便攜式存儲是指未被系統合併的任何外部存儲設備,未被格式化,加密,Android6.0支持合併外部存儲,使其向內部存儲一樣使用,合併外部存儲設備時,系統對其進行格式化和加密處理。
當插入新的外部存儲設備的時候,系統會詢問想如何使用該外部存儲設備,用戶可以選擇合併來對該外部存儲進行格式化加密,也可以不合並,只對其進行簡單的訪問操作。
合併的外部存儲設備必須使用支持POSIX權限和拓展屬性(ext4,f2fs)的文件系統進行格式化,
合併的重點概念:合併的外部存儲設備在給格式化加密後,只能都在當前設備上運行,因此可以在該外部存儲上放心存放私人隱私數據了。
12.cache和system,data和storage目錄
這些目錄中,system和data目錄是存在內部存儲,cache和storage是存在外部存儲。
其中download目錄用來存放下載的文件
13.應用在內部存儲中的目錄分類
/data/${USERID}/${PACKAGENAME}/目錄下存放應用的目錄和數據,一般有如下幾個目錄:
cache 用來存放緩存數據
database 用來存放用到的sqlite數據庫文件
shared_prefs 存放應用生成和修改的shared_preference數據(鍵值對)
files 用來存放普通數據,如log,json數據等
14.什麼是app專屬文件
專屬文件是屬於某個app的,其文件路徑是帶有包名的,當app卸載的時候,它們會隨着一起被刪除,當在設置界面中手動刪除某個應用的數據時,刪除的就是這部分數據
15.如何判斷設備是否有外部存儲
if(MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
16.清除數據和清除緩存的區別
清除數據是對應內部和外部存儲中的應用的files目錄中的數據
清除緩存是對應內部和外部存儲中的應用的cacge目錄中的數據,其是APP運行過程中所產生的臨時數據
17.爲什麼不建議使用絕對路徑存放應用app數據
因爲應用app的數據目錄(緩存目錄也一樣)會隨着app遷移到外部存儲而發生變化,因此建議使用相對路徑。
18.內部存儲控件不需要申請權限
19.外部存儲控件中的公共目錄:
一般來說,系統已經提供了幾個默認的公共目錄,通過類型參數調用Environment.getExternalStoragePublicDirectory函數可以訪問到這些目錄
公共目錄的類型參數有如下幾類:
Music
Movies
Pictures
Download
用戶也可以用自己的類型去調用該函數來訪問自定義類型的公共目錄
很重要的一點是,公共目錄也是對多用戶隔離的