詳解Android 中的文件存儲(chǔ)
概要
當(dāng)我們查看手機(jī)的文件管理器的時(shí)候,會(huì)發(fā)現(xiàn)里面的文件五花八門(mén),想要找到自己項(xiàng)目所對(duì)應(yīng)的文件非常困難,甚至有可能壓根就找不到自己的文件,本文就來(lái)介紹一下APP開(kāi)發(fā)過(guò)程當(dāng)中文件存儲(chǔ)的注意事項(xiàng)。
通常我們會(huì)將存放的文件分為兩種:獨(dú)立文件和專(zhuān)屬文件。顧名思義,獨(dú)立文件就是獨(dú)立于APP之外的文件,不會(huì)隨著APP的刪除而刪除,而專(zhuān)屬文件則是專(zhuān)屬于某個(gè)APP的文件,當(dāng)APP刪除后,會(huì)自動(dòng)清空相對(duì)應(yīng)的專(zhuān)屬文件。
獨(dú)立文件
獨(dú)立文件指的是存放在shared/external storage directory下的文件,通常意義上就是我們的SD卡??梢酝ㄟ^(guò)以下方法獲取SD卡路徑:
Environment.getExternalStorageDirectory ()
不建議將文件存儲(chǔ)在SD卡的根目錄下,這樣會(huì)污染用戶(hù)的SD卡根目錄,通常是在根目錄下建立一個(gè)次級(jí)目錄并將文件存儲(chǔ)在次級(jí)目錄下面:
File sdCardDir = Environment.getExternalStorageDirectory (); File cacheDir = new File(sdCardDir, "Cache");
得到的路徑如下所示:
/storage/emulated/0/Cache
不同平臺(tái)下SD卡的路徑有所差別,所以開(kāi)發(fā)者通常都是持有一個(gè)相對(duì)路徑。
Tips:不同手機(jī)廠(chǎng)商外部存儲(chǔ)根目錄(Environment.getExternalStorageDirectory())的物理地址不一定相同,但它們映射之后的根目錄通常都是一致的,映射之后的根目錄為:/mnt/sdcard/
還可以通過(guò)另一種方法獲取一個(gè)SD卡的次級(jí)目錄:
Environment.getExternalStoragePublicDirectory(String)
針對(duì)于該方法,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
個(gè)人還是更喜歡第一種方法,因?yàn)榈谝环N方法更加的靈活,可以自定義次級(jí)目錄。
當(dāng)然,在向SD卡存儲(chǔ)文件之前,還需要判斷SD卡是否存在,判斷的方法如下:
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
// SD卡存在
}
由于要存儲(chǔ)的是獨(dú)立文件,還需要添加讀寫(xiě)權(quán)限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
通常情況下只要添加寫(xiě)權(quán)限即可,添加寫(xiě)權(quán)限就默認(rèn)添了讀權(quán)限,這兩個(gè)權(quán)限始于Android4.4(KITKAT)
專(zhuān)屬文件
專(zhuān)屬文件可以存放在external storage,也可以存放在internal storage。external storage指的是SD卡,internal storage指的是手機(jī)自帶的存儲(chǔ)區(qū)域。有人可能會(huì)有疑問(wèn):之前獨(dú)立文件不也存放在SD卡中嗎?怎么專(zhuān)屬文件也放在SD卡中,我們的APP怎么區(qū)分這兩者呢?其中獨(dú)立文件通常是存放在SD卡的次級(jí)目錄下,比如剛才提到的"根目錄/Cache",而專(zhuān)屬文件則是存儲(chǔ)于"根目錄/Android/data/packge name"目錄下面,當(dāng)APP刪除時(shí),會(huì)自動(dòng)銷(xiāo)毀這個(gè)文件夾。
通常情況下,我們會(huì)將一些體量比較小的數(shù)據(jù)存放在internal storage中,比如Shared Prefrence文件或者數(shù)據(jù)庫(kù)文件,而將一些體量較大的文件放在external storage中,比如視頻,圖片文件。
存儲(chǔ)專(zhuān)屬文件不需要讀寫(xiě)權(quán)限~~
internal storage
獲取APP在internal storage中存儲(chǔ)路徑的方法如下:
getCacheDir();
getFileDir();
getDir("name", mode);
得到的路徑如下所示:
/data/data/<package name>/cache /data/data/<package name>/file /data/data/<package name>/"name"
這是APP的私有路徑,對(duì)于沒(méi)有root過(guò)的手機(jī),用戶(hù)是無(wú)法訪(fǎng)問(wèn)該路徑的,所以安全性有所保障(開(kāi)發(fā)人員可以在AS3.0以上版本的Device File Explorer中訪(fǎng)問(wèn)該路徑)。同時(shí)手機(jī)的SD卡并不是任何時(shí)候都可用的,所以我們必須要將重要的數(shù)據(jù)存放在internal storage中。
根據(jù)Android SDK的說(shuō)法,當(dāng)手機(jī)磁盤(pán)空間不足時(shí),系統(tǒng)會(huì)自動(dòng)將清除cache目錄下的文件(除cache以外的其它內(nèi)部存儲(chǔ)空間不會(huì)被自動(dòng)清除)。針對(duì)這種情況,需要將緩存盡可能存儲(chǔ)在非cache文件夾中;或者將cache文件夾下的文件大小控制在系統(tǒng)指標(biāo)之下,獲取系統(tǒng)指標(biāo)的方法如下:
getCacheQuotaBytes(java.util.UUID)
如果控制在該指標(biāo)以下,文件的清除優(yōu)先級(jí)將會(huì)被排到最低(指標(biāo)是Android8.0特性)。
external storage
獲取APP在external storage中存儲(chǔ)路徑的方法如下:
getExternalCacheDir()
得到的路徑之前也提過(guò)一筆,如下所示:
/storage/emulated/0/Android/data/<package name>/cache
熟悉了external storage的路徑后,也可以通過(guò)SD卡的根目錄來(lái)手動(dòng)創(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();
}
除了上面提到過(guò)的視頻、圖片文件,有的時(shí)候,開(kāi)發(fā)者還希望在APP的專(zhuān)屬路徑下放一些可訪(fǎng)問(wèn)的文件,比如crash或者debug的log日志文件,此時(shí)internal storage不能滿(mǎn)足需求(用戶(hù)無(wú)法訪(fǎng)問(wèn)internal storage并反饋具體日志),就可以將這些專(zhuān)屬文件放在external storage目錄下。
以上就是詳解Android 中的文件存儲(chǔ)的詳細(xì)內(nèi)容,更多關(guān)于Android 文件存儲(chǔ)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Android實(shí)現(xiàn)保存QQ賬號(hào)與密碼功能(文件存儲(chǔ))
- Android開(kāi)發(fā)文件存儲(chǔ)實(shí)例
- Android 文件存儲(chǔ)與SharedPreferences存儲(chǔ)方式詳解用法
- 淺析Android文件存儲(chǔ)
- android I/0流操作文件(文件存儲(chǔ))
- Android存儲(chǔ)字符串?dāng)?shù)據(jù)到txt文件
- Android圖片添加水印圖片并把圖片保存到文件存儲(chǔ)的實(shí)現(xiàn)代碼
- Android開(kāi)發(fā)實(shí)現(xiàn)讀取Assets下文件及文件寫(xiě)入存儲(chǔ)卡的方法
- Android?文件存儲(chǔ)系統(tǒng)原理
相關(guān)文章
Android OkHttp 結(jié)合php 多圖片上傳實(shí)例
本篇文章主要介紹了Android OkHttp 結(jié)合php 多圖片上傳實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
android okhttp的基礎(chǔ)使用【入門(mén)推薦】
本文主要總結(jié)了Android著名網(wǎng)絡(luò)框架-okhttp的基礎(chǔ)使用。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01
Android解析json數(shù)組對(duì)象的方法及Apply和數(shù)組的三個(gè)技巧
這篇文章主要介紹了Android解析json數(shù)組對(duì)象的方法及Apply和數(shù)組的三個(gè)技巧的相關(guān)資料,需要的朋友可以參考下2015-12-12
Android自定義Toast樣式實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Android自定義Toast樣式,Toast是一種很方便的消息提示框,會(huì)在 屏幕中顯示一個(gè)消息提示框,沒(méi)任何按鈕,也不會(huì)獲得焦點(diǎn)一段時(shí)間過(guò)后自動(dòng)消失!非常常用!本文就來(lái)通過(guò)一個(gè)例子把Toast的使用講透2023-01-01
Android 中build.prop 文件與 getprop 命令
這篇文章主要介紹了Android 中build.prop 文件與 getprop 命令的相關(guān)資料,需要的朋友可以參考下2017-06-06
詳解Android 進(jìn)程間通信的幾種實(shí)現(xiàn)方式
在Android SDK中提供了4種用于跨進(jìn)程通訊的方式。這篇文章主要介紹了詳解Android 進(jìn)程間通信的幾種實(shí)現(xiàn)方式,有興趣的可以了解一下。2017-01-01
Android studio 混淆+打包+驗(yàn)證是否成功
本文主要介紹了Android studio 混淆+打包+驗(yàn)證是否成功的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03
Android中ViewFlipper的使用及設(shè)置動(dòng)畫(huà)效果實(shí)例詳解
這篇文章主要介紹了Android中ViewFlipper的使用及設(shè)置動(dòng)畫(huà)效果的方法,以實(shí)例形式較為詳細(xì)的分析了ViewFlipper的功能、原理及設(shè)置與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10

