?Android開(kāi)發(fā)中我們常常聽(tīng)到這樣幾個(gè)概念浓冒,內(nèi)存栽渴,內(nèi)部存儲(chǔ),外部存儲(chǔ)稳懒,很多人常常將這幾個(gè)概念搞混闲擦。
?內(nèi)存(Memory)、內(nèi)部存儲(chǔ)(InternalStorage)僚祷、外部存儲(chǔ)(ExternalStorage)佛致,這在英文中本不會(huì)產(chǎn)生歧義,但是當(dāng)我們翻譯成中文之后辙谜,前兩個(gè)都簡(jiǎn)稱為內(nèi)存俺榆,于是就混了。
?我們可對(duì)Android手機(jī)存儲(chǔ)空間做如下劃分:
- 內(nèi)存:RAM
- 內(nèi)部存儲(chǔ):內(nèi)部ROM
- 外部存儲(chǔ):外部ROM和SDCard
?最容易混淆的是外部存儲(chǔ)装哆,如果說(shuō)pc上也要區(qū)分出外部存儲(chǔ)和內(nèi)部存儲(chǔ)的話罐脊,那么自帶的硬盤(pán)算是內(nèi)部存儲(chǔ),U盤(pán)或者移動(dòng)硬盤(pán)算是外部存儲(chǔ)蜕琴,因此我們很容易帶著這樣的理解去看待android手機(jī)萍桌,認(rèn)為機(jī)身固有的存儲(chǔ)是內(nèi)部存儲(chǔ),而擴(kuò)展的T卡是外部存儲(chǔ)凌简。早期的android設(shè)備內(nèi)部存儲(chǔ)確實(shí)是固定的上炎,而外部存儲(chǔ)確實(shí)是可以像U盤(pán)一樣移動(dòng)的。但是在后來(lái)的設(shè)備中雏搂,很多中高端的機(jī)器都將自己的機(jī)身存儲(chǔ)擴(kuò)展到了8G以上藕施,他們將存儲(chǔ)在概念上分成了"內(nèi)部internal"和"外部external"兩部分,但其實(shí)都在手機(jī)內(nèi)部凸郑。所以不管android手機(jī)是否有可移動(dòng)的sdcard裳食,他們總是有外部存儲(chǔ)和內(nèi)部存儲(chǔ)。最關(guān)鍵的是芙沥,我們都是通過(guò)相同的api來(lái)訪問(wèn)可移動(dòng)的sdcard或者手機(jī)自帶的存儲(chǔ)诲祸。
?使用DDMS打開(kāi)手機(jī)目錄浊吏,這里有3個(gè)文件夾需要注意,data救氯、mnt和storage找田,data是指內(nèi)部存儲(chǔ),mnt和storage指外部存儲(chǔ)径密。下面詳細(xì)介紹下內(nèi)部存儲(chǔ)和外部存儲(chǔ):
1.內(nèi)部存儲(chǔ)
?內(nèi)部存儲(chǔ)位于系統(tǒng)中很特殊的一個(gè)位置午阵,如果你想將文件儲(chǔ)存于內(nèi)部存儲(chǔ)中,那么文件默認(rèn)只能被你的應(yīng)用訪問(wèn)到享扔,且一個(gè)應(yīng)用創(chuàng)建的所有文件都在和應(yīng)用包名相同的目錄下底桂。也就是說(shuō)應(yīng)用創(chuàng)建于內(nèi)部存儲(chǔ)的文件,與這個(gè)應(yīng)用是關(guān)聯(lián)起來(lái)的惧眠。當(dāng)一個(gè)應(yīng)用卸載之后籽懦,內(nèi)部存儲(chǔ)中的這些文件也被刪除。從技術(shù)上來(lái)講如果你在創(chuàng)建內(nèi)部存儲(chǔ)文件的時(shí)候?qū)⑽募傩栽O(shè)置成可讀氛魁,其他app能夠訪問(wèn)自己應(yīng)用的數(shù)據(jù)暮顺,前提是他知道你這個(gè)應(yīng)用的包名,如果一個(gè)文件的屬性是私有(private)秀存,那么即使知道包名其他應(yīng)用也無(wú)法訪問(wèn)捶码。 內(nèi)部存儲(chǔ)空間十分有限,因而顯得可貴或链,另外惫恼,它也是系統(tǒng)本身和系統(tǒng)應(yīng)用程序主要的數(shù)據(jù)存儲(chǔ)所在地,一旦內(nèi)部存儲(chǔ)空間耗盡澳盐,手機(jī)也就無(wú)法使用了祈纯。來(lái)看一下內(nèi)部存儲(chǔ)中的兩個(gè)重要目錄:
(1)app文件夾,沒(méi)有root的手機(jī)不能打開(kāi)該文件夾叼耙。app文件夾里存放著我們所有安裝的app的apk文件夾腕窥,當(dāng)我們調(diào)試一個(gè)app的時(shí)候,可以看到控制臺(tái)輸出的內(nèi)容筛婉,有一項(xiàng)是uploading...,就是上傳我們的apk到這個(gè)文件夾簇爆。
(2)data文件夾,這個(gè)文件夾里邊都是一些包名爽撒,打開(kāi)這些包名后我們會(huì)看到這樣一些文件:
- data/data/包名/shared_prefs
- data/data/包名/database
- data/data/包名/files
- data/data/包名/cache
?我們?cè)谑褂肧harePerference的時(shí)候冕碟,將數(shù)據(jù)持久化存儲(chǔ)于本地,其實(shí)就是存在這個(gè)文件夾中的xml文件里匆浙,我們的app里邊的數(shù)據(jù)庫(kù)文件就存儲(chǔ)于databases文件夾中,還有我們的普通數(shù)據(jù)存儲(chǔ)在files中厕妖,緩存在cache文件夾中首尼。
2.外部存儲(chǔ)
?外部存儲(chǔ)就是我們上面看到的storage文件夾,也有可能是mnt文件夾,在storage文件夾中有一個(gè)sdcard文件夾软能,這個(gè)文件夾中的文件又分為兩類迎捺,一類是公有目錄,還有一類是私有目錄查排,其中公有目錄有9大類凳枝,比如DCIM,Download等這些系統(tǒng)為我們創(chuàng)建的文件夾,私有目錄就是android這個(gè)文件夾跋核,這個(gè)文件夾打開(kāi)后里邊有一個(gè)data文件夾岖瑰,打開(kāi)這個(gè)文件夾,里面包含了許多包名組成的文件夾砂代。
?Android應(yīng)用程序在運(yùn)行的過(guò)程中如果需要向手機(jī)上保存數(shù)據(jù)蹋订,一般是把數(shù)據(jù)保存在SDcard中的,大部分應(yīng)用是直接在SDcard的根目錄創(chuàng)建一個(gè)文件夾刻伊,然后把數(shù)據(jù)直接保存在該文件夾下露戒,這樣當(dāng)該應(yīng)用被卸載后,這些數(shù)據(jù)還保留在SDcard中捶箱,留下了垃圾數(shù)據(jù)智什。
?開(kāi)發(fā)中我們一般都是操作存儲(chǔ)空間,Google官方建議我們App的數(shù)據(jù)應(yīng)該存儲(chǔ)在外部存儲(chǔ)的私有目錄中該App的包名下丁屎,這樣當(dāng)用戶卸載掉App之后荠锭,相關(guān)的數(shù)據(jù)會(huì)一并刪除,如果你直接在/storage/sdcard目錄下創(chuàng)建了一個(gè)應(yīng)用的文件夾悦屏,那么當(dāng)你刪除應(yīng)用的時(shí)候节沦,這個(gè)文件夾就不會(huì)被刪除。
目錄操作
最后介紹常用的獲取特定存儲(chǔ)目錄的方法:
(1)context.getFilesDir() 內(nèi)部存儲(chǔ)data/data/包名/files目錄
(2)context.getCacheDir() 內(nèi)部存儲(chǔ)data/data/包名/cache目錄
(3)Environment.getExternalStorageDirectory() 外部存儲(chǔ)根目錄
(3)Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DCIM) 外部存儲(chǔ)公有目錄
(4)context.getExternalFilesDir() 外部存儲(chǔ)私有目錄storage/sdcard/Android/data/包名/files
(5)context.getExternalCacheDir() 外部存儲(chǔ)私有目錄storage/sdcard/Android/data/包名/cache
?通過(guò)Context.getExternalFilesDir()方法可以獲取到SDCard/Android/data/你的應(yīng)用的包名/files/目錄础爬,一般放一些長(zhǎng)時(shí)間保存的數(shù)據(jù)甫贯。
?通過(guò)Context.getExternalCacheDir()方法可以獲取到SDCard/Android/data/你的應(yīng)用包名/cache/目錄,一般存放臨時(shí)緩存數(shù)據(jù)看蚜。
?使用上面的方法叫搁,當(dāng)應(yīng)用被卸載后,SDCard/Android/data/你的應(yīng)用包名/這個(gè)目錄下的所有文件都會(huì)被刪除供炎,不會(huì)留下垃圾信息渴逻。上面兩個(gè)目錄分別對(duì)應(yīng) 設(shè)置->應(yīng)用->應(yīng)用詳情里面的“清除數(shù)據(jù)”與“清除緩存”選項(xiàng)。