詳解Android 中的文件存儲
概要
當(dāng)我們查看手機(jī)的文件管理器的時候,會發(fā)現(xiàn)里面的文件五花八門,想要找到自己項目所對應(yīng)的文件非常困難,甚至有可能壓根就找不到自己的文件,本文就來介紹一下APP開發(fā)過程當(dāng)中文件存儲的注意事項。
通常我們會將存放的文件分為兩種:獨立文件和專屬文件。顧名思義,獨立文件就是獨立于APP之外的文件,不會隨著APP的刪除而刪除,而專屬文件則是專屬于某個APP的文件,當(dāng)APP刪除后,會自動清空相對應(yīng)的專屬文件。
獨立文件
獨立文件指的是存放在shared/external storage directory下的文件,通常意義上就是我們的SD卡??梢酝ㄟ^以下方法獲取SD卡路徑:
Environment.getExternalStorageDirectory ()
不建議將文件存儲在SD卡的根目錄下,這樣會污染用戶的SD卡根目錄,通常是在根目錄下建立一個次級目錄并將文件存儲在次級目錄下面:
File sdCardDir = Environment.getExternalStorageDirectory (); File cacheDir = new File(sdCardDir, "Cache");
得到的路徑如下所示:
/storage/emulated/0/Cache
不同平臺下SD卡的路徑有所差別,所以開發(fā)者通常都是持有一個相對路徑。
Tips:不同手機(jī)廠商外部存儲根目錄(Environment.getExternalStorageDirectory())的物理地址不一定相同,但它們映射之后的根目錄通常都是一致的,映射之后的根目錄為:/mnt/sdcard/
還可以通過另一種方法獲取一個SD卡的次級目錄:
Environment.getExternalStoragePublicDirectory(String)
針對于該方法,Android已經(jīng)給出了一套固定的String參數(shù):
Environment.DIRECTORY_ALARMS Environment.DIRECTORY_DCIM Environment.DIRECTORY_DOCUMENTS Environment.DIRECTORY_DOWNLOADS Environment.DIRECTORY_MOVIES Environment.DIRECTORY_MUSIC Environment.DIRECTORY_NOTIFICATIONS Environment.DIRECTORY_PICTURES Environment.DIRECTORY_PODCASTS Environment.DIRECTORY_RINGTONES // ps:調(diào)用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) // 得到的路徑就是:/storage/emulated/0/Pictures
個人還是更喜歡第一種方法,因為第一種方法更加的靈活,可以自定義次級目錄。
當(dāng)然,在向SD卡存儲文件之前,還需要判斷SD卡是否存在,判斷的方法如下:
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){ // SD卡存在 }
由于要存儲的是獨立文件,還需要添加讀寫權(quán)限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
通常情況下只要添加寫權(quán)限即可,添加寫權(quán)限就默認(rèn)添了讀權(quán)限,這兩個權(quán)限始于Android4.4(KITKAT)
專屬文件
專屬文件可以存放在external storage,也可以存放在internal storage。external storage指的是SD卡,internal storage指的是手機(jī)自帶的存儲區(qū)域。有人可能會有疑問:之前獨立文件不也存放在SD卡中嗎?怎么專屬文件也放在SD卡中,我們的APP怎么區(qū)分這兩者呢?其中獨立文件通常是存放在SD卡的次級目錄下,比如剛才提到的"根目錄/Cache",而專屬文件則是存儲于"根目錄/Android/data/packge name"目錄下面,當(dāng)APP刪除時,會自動銷毀這個文件夾。
通常情況下,我們會將一些體量比較小的數(shù)據(jù)存放在internal storage中,比如Shared Prefrence文件或者數(shù)據(jù)庫文件,而將一些體量較大的文件放在external storage中,比如視頻,圖片文件。
存儲專屬文件不需要讀寫權(quán)限~~
internal storage
獲取APP在internal storage中存儲路徑的方法如下:
getCacheDir(); getFileDir(); getDir("name", mode);
得到的路徑如下所示:
/data/data/<package name>/cache /data/data/<package name>/file /data/data/<package name>/"name"
這是APP的私有路徑,對于沒有root過的手機(jī),用戶是無法訪問該路徑的,所以安全性有所保障(開發(fā)人員可以在AS3.0以上版本的Device File Explorer中訪問該路徑)。同時手機(jī)的SD卡并不是任何時候都可用的,所以我們必須要將重要的數(shù)據(jù)存放在internal storage中。
根據(jù)Android SDK的說法,當(dāng)手機(jī)磁盤空間不足時,系統(tǒng)會自動將清除cache目錄下的文件(除cache以外的其它內(nèi)部存儲空間不會被自動清除)。針對這種情況,需要將緩存盡可能存儲在非cache文件夾中;或者將cache文件夾下的文件大小控制在系統(tǒng)指標(biāo)之下,獲取系統(tǒng)指標(biāo)的方法如下:
getCacheQuotaBytes(java.util.UUID)
如果控制在該指標(biāo)以下,文件的清除優(yōu)先級將會被排到最低(指標(biāo)是Android8.0特性)。
external storage
獲取APP在external storage中存儲路徑的方法如下:
getExternalCacheDir()
得到的路徑之前也提過一筆,如下所示:
/storage/emulated/0/Android/data/<package name>/cache
熟悉了external storage的路徑后,也可以通過SD卡的根目錄來手動創(chuàng)建路徑:
File dataDir = new File(new File(Environment.getExternalStorageDirectory(), "Android"), "data"); File externalCacheDir = new File(new File(dataDir, context.getPackageName()), "cache"); if (!externalCacheDir.exists()) { externalCacheDir.mkdirs(); }
除了上面提到過的視頻、圖片文件,有的時候,開發(fā)者還希望在APP的專屬路徑下放一些可訪問的文件,比如crash或者debug的log日志文件,此時internal storage不能滿足需求(用戶無法訪問internal storage并反饋具體日志),就可以將這些專屬文件放在external storage目錄下。
以上就是詳解Android 中的文件存儲的詳細(xì)內(nèi)容,更多關(guān)于Android 文件存儲的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android中RecyclerView嵌套滑動沖突解決的代碼片段
這篇文章主要為大家詳細(xì)介紹了Android中RecyclerView嵌套滑動沖突解決的代碼片段,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12手把手教學(xué)Android用jsoup解析html實例
本篇文章主要介紹了手把手教學(xué)Android用jsoup解析html實例,jsoup 是一款Java 的HTML解析器。具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06Android使用CountDownTimer實現(xiàn)倒數(shù)定時器效果
這篇文章主要介紹了Android使用CountDownTimer實現(xiàn)倒數(shù)定時器效果的資料,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。2017-02-02Android通過json向MySQL中讀寫數(shù)據(jù)的方法詳解【寫入篇】
這篇文章主要介紹了Android通過json向MySQL中讀寫數(shù)據(jù)的方法,結(jié)合實例形式較為詳細(xì)的分析了Android json類的定義、調(diào)用及php接收json數(shù)據(jù)并寫入mysql的實現(xiàn)技巧,需要的朋友可以參考下2016-06-06解決AndroidStudio無法運行java中的mian方法問題
這篇文章主要介紹了解決AndroidStudio無法運行java中的mian方法問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10