一、前言
最近在項(xiàng)目不是很忙的時(shí)候索烹,回顧Android系統(tǒng)的文件存儲(chǔ)功能工碾,結(jié)合自己的經(jīng)驗(yàn),也查閱了好多相關(guān)的文檔百姓,發(fā)現(xiàn)了好多好文章渊额,真的非常感謝,寫的挺好的垒拢。
一直以來旬迹,恐怕都有一大堆的問題困擾著Android初學(xué)者,比如說:
- 內(nèi)存求类,內(nèi)部存儲(chǔ)奔垦,外部存儲(chǔ),概念的區(qū)分尸疆?
- 內(nèi)部存儲(chǔ)都包含哪些目錄椿猎?外部存儲(chǔ)又包含哪些?
- 清除APP的緩存寿弱,都刪除了哪些文件目錄呢犯眠?
- 清除APP的數(shù)據(jù),又刪除了哪些文件目錄呢脖捻?
- 哪些文件目錄是APP私有的阔逼,哪些又是公共的目錄?
- SharedPreferences地沮、數(shù)據(jù)庫一般都存儲(chǔ)在什么目錄嗜浮?
今天盡我所能的表述一下這些知識(shí)點(diǎn),如有遺漏或者錯(cuò)誤摩疑,請(qǐng)指正危融。
二、存儲(chǔ)分類
2.1 內(nèi)部存儲(chǔ)
內(nèi)部存儲(chǔ)空間是 App 私有的存儲(chǔ)數(shù)據(jù)的存儲(chǔ)空間雷袋,系統(tǒng)會(huì)阻止其他應(yīng)用對(duì)這部分?jǐn)?shù)據(jù)的訪問 (除非有root權(quán)限)吉殃,并且在 Android 10(API 級(jí)別 29)
及更高版本中,系統(tǒng)會(huì)對(duì)這些位置進(jìn)行加密楷怒。 內(nèi)部存儲(chǔ)空間的特性讓它很適合存儲(chǔ)只有 App 本身才能訪問的敏感數(shù)據(jù)蛋勺。
內(nèi)部存儲(chǔ)空間可以通過 Context.getFileDir()
或 Context.getCacheDir()
獲取到,主要路徑是:
Context.getFileDir() 獲取的路徑為:
- data/data/packagename/files (部分手機(jī)廠商)
- data/user/0/packagename/files (部分手機(jī)廠商)
Context.getCacheDir() 獲取的路徑為:
- data/data/packagename/cache (部分手機(jī)廠商)
- data/user/0/packagename/cache (部分手機(jī)廠商)
ps: 該目錄內(nèi)的文件在設(shè)備內(nèi)存不足時(shí)會(huì)優(yōu)先被刪除掉鸠删,所以存放在這里的文件是沒有任何保障的抱完,可能會(huì)隨時(shí)丟掉。
最后附上一張截圖刃泡,此圖問內(nèi)部存儲(chǔ)目錄
2.2 外部存儲(chǔ)
外部存儲(chǔ)空間包括 App 私有目錄和公共目錄巧娱。
- App 私有目錄: App 的私有目錄雖然名曰私有目錄碉怔,但是其他應(yīng)用可以通過絕對(duì)路徑訪問當(dāng)前目錄下的數(shù)據(jù),應(yīng)用卸載后也會(huì)隨之刪除禁添。
- 公共目錄:外部可以自由訪問撮胧,應(yīng)用刪除后這部分存儲(chǔ)的數(shù)據(jù)不會(huì)刪除。
2.2.1 APP私有目錄
// 可以通過以下函數(shù)獲取
Context.externalCacheDir
Context.externalCacheDirs
Context.getExternalFilesDir(String)
Context.getExternalFilesDirs(String)
Context.externalMediaDirs
得到的對(duì)應(yīng)目錄是:
externalCacheDir: /storage/emulated/0/Android/data/packagename/cache
externalCacheDirs: /storage/emulated/0/Android/data/packagename/cache
ExternalFilesDir: /storage/emulated/0/Android/data/packagename/files
ExternalFilesDirs: /storage/emulated/0/Android/data/packagename/files
externalMediaDirs: /storage/emulated/0/Android/media/packagename
附上一張外部存儲(chǔ)的私有目錄截圖:
可能會(huì)有人問這不是"/mnt/sdcard/Android/datapackagename/"
嗎老翘,和上述的 "/storage/emulated/0/Android/data/packagename/"
目錄不同啊芹啥,后續(xù)會(huì)提到的。
2.2.2 外部公共目錄
不要被這里的“外部”這個(gè)詞弄糊涂了酪捡。最好將此目錄視為媒體/共享的存儲(chǔ)部分叁征。它是一個(gè)文件系統(tǒng)纳账,可以保存相對(duì)大量的數(shù)據(jù)逛薇,并且在所有應(yīng)用程序之間共享(不強(qiáng)制執(zhí)行權(quán)限)。傳統(tǒng)上這是一張 SD 卡疏虫,但它也可以作為設(shè)備中的內(nèi)置存儲(chǔ)實(shí)現(xiàn)永罚,與受保護(hù)的內(nèi)部存儲(chǔ)不同,并且可以作為文件系統(tǒng)安裝在計(jì)算機(jī)上卧秘。
在具有多個(gè)用戶的設(shè)備上(如 UserManager 所述)呢袱,每個(gè)用戶都有自己的隔離共享存儲(chǔ)。應(yīng)用程序只能訪問它們正在運(yùn)行的用戶的共享存儲(chǔ)翅敌。
獲取方式:
Environment.getExternalStorageState() // SD 卡狀態(tài)
Environment.getExternalStorageDirectory()
Environment.getExternalStoragePublicDirectory(String)
輸出內(nèi)容:
getExternalStorageState: mounted // 已掛載
getExternalStorageDirectory: /storage/emulated/0
getExternalStoragePublicDirectory: /storage/emulated/0
根據(jù)google官方文檔提示羞福,getExternalStorageDirectory
和 getExternalStoragePublicDirectory
已經(jīng)被標(biāo)記為棄用,可以使用 Context.getExternalFilesDir(String)
蚯涮、MediaStore
或 Intent.ACTION_OPEN_DOCUMENT
等替代方案治专,它們性能更好。
在上述的需要傳遞 String 參數(shù)的方法中遭顶,例如Context.getExternalFilesDir(String)
和getExternalStoragePublicDirectory(String)
张峰,String 有以下幾個(gè)常量值:
- DIRECTORY_MUSIC // 音樂
- DIRECTORY_PODCASTS // 博客
- DIRECTORY_RINGTONES // 鈴聲
- DIRECTORY_ALARMS // 鬧鐘
- DIRECTORY_NOTIFICATIONS // 通知
- DIRECTORY_PICTURES // 圖片
- DIRECTORY_MOVIES // 電影
- DIRECTORY_DOWNLOADS // 下載
- DIRECTORY_DCIM // 照片
- DIRECTORY_DOCUMENTS // 文檔
附上一張外部公共目錄的截圖:
2.3 系統(tǒng)目錄
Environment 還提供了對(duì)一些系統(tǒng)目錄的訪問方法:
Environment.getRootDirectory() // 系統(tǒng)分區(qū)的 root 路徑
Environment.getDataDirectory() // 獲取用戶數(shù)據(jù)目錄的路徑
Environment.getDownloadCacheDirectory() // 獲取用戶緩存目錄的路徑
// 輸出為
getRootDirectory: /system
getDataDirectory: /data
getDownloadCacheDirectory: /data/cache
三、問題解答
3.1 內(nèi)存棒旗,內(nèi)部存儲(chǔ)喘批,外部存儲(chǔ),概念的區(qū)分铣揉?內(nèi)部存儲(chǔ)都包含哪些目錄饶深?外部存儲(chǔ)又包含哪些?
1逛拱、內(nèi)存(Memory/RAM)
:
內(nèi)存(Memory)是計(jì)算機(jī)的重要部件敌厘,也稱內(nèi)存儲(chǔ)器和主存儲(chǔ)器,擁有極高的讀寫速度橘券,用于暫時(shí)存放CPU中的運(yùn)算數(shù)據(jù)额湘,以及與硬盤等外部存儲(chǔ)器交換的數(shù)據(jù)卿吐。
它是外存與CPU進(jìn)行溝通的橋梁,計(jì)算機(jī)中所有程序的運(yùn)行都在內(nèi)存中進(jìn)行锋华,內(nèi)存性能的強(qiáng)弱影響計(jì)算機(jī)整體發(fā)揮的水平嗡官。
只要計(jì)算機(jī)開始運(yùn)行,操作系統(tǒng)就會(huì)把需要運(yùn)算的數(shù)據(jù)從內(nèi)存調(diào)到CPU中進(jìn)行運(yùn)算毯焕,當(dāng)運(yùn)算完成衍腥,CPU將結(jié)果傳送出來。
2纳猫、內(nèi)部存儲(chǔ)
:
注意內(nèi)部存儲(chǔ)不是內(nèi)存婆咸。
內(nèi)部存儲(chǔ)位于系統(tǒng)中很特殊的一個(gè)位置,如果你想將文件存儲(chǔ)于內(nèi)部存儲(chǔ)中芜辕,那么文件默認(rèn)只能被你的應(yīng)用訪問到尚骄,且一個(gè)應(yīng)用所創(chuàng)建的所有文件都在和應(yīng)用包名相同的目錄下。也就是說應(yīng)用創(chuàng)建于內(nèi)部存儲(chǔ)的文件侵续,與這個(gè)應(yīng)用是關(guān)聯(lián)起來的倔丈。
當(dāng)一個(gè)應(yīng)用卸載之后,內(nèi)部存儲(chǔ)中的這些文件也被刪除状蜗。
從技術(shù)上來講需五,如果你在創(chuàng)建內(nèi)部存儲(chǔ)文件的時(shí)候?qū)⑽募傩栽O(shè)置成可讀,其他app能夠訪問自己應(yīng)用的數(shù)據(jù)轧坎,前提是他知道你這個(gè)應(yīng)用的包名宏邮,如果一個(gè)文件的屬性是私有(private),那么即使知道包名其他應(yīng)用也無法訪問缸血。
內(nèi)部存儲(chǔ)空間十分有限蜜氨,因而顯得可貴,另外属百,它也是系統(tǒng)本身和系統(tǒng)應(yīng)用程序主要的數(shù)據(jù)存儲(chǔ)所在地记劝,一旦內(nèi)部存儲(chǔ)空間耗盡,手機(jī)也就無法使用了族扰。所以對(duì)于內(nèi)部存儲(chǔ)空間厌丑,我們要盡量避免使用。Shared Preferences和SQLite數(shù)據(jù)庫都是存儲(chǔ)在內(nèi)部存儲(chǔ)空間上的渔呵。內(nèi)部存儲(chǔ)一般用Context來獲取和操作怒竿。
3、外部存儲(chǔ)
:
最容易混淆的是外部存儲(chǔ)扩氢,因?yàn)槔系腁ndroid系統(tǒng)的跟新的Android系統(tǒng)是有差別的耕驰,很多人去網(wǎng)上查找資料,看了一下以前的資料录豺,又看了一下現(xiàn)在的資料朦肘,但是發(fā)現(xiàn)它們說法不一樣然后就困惑了饭弓。
首先說一個(gè)大家普遍的概念:
如果在pc機(jī)上是區(qū)分外部存儲(chǔ)和內(nèi)部存儲(chǔ)的話,那么電腦自帶的硬盤算是內(nèi)部存儲(chǔ)媒抠,U盤或者移動(dòng)硬盤就是外部存儲(chǔ)了弟断。
因此很多人帶著這樣的理解去看待安卓手機(jī),把內(nèi)置存儲(chǔ)(機(jī)身存儲(chǔ))當(dāng)做內(nèi)部存儲(chǔ)趴生,而把擴(kuò)展的SD卡當(dāng)做是外部存儲(chǔ)阀趴。這么認(rèn)為確實(shí)沒錯(cuò),因?yàn)樵?.4(API19)以前的手機(jī)上確實(shí)是這樣的苍匆,手機(jī)自身帶的存儲(chǔ)卡就是內(nèi)部存儲(chǔ)刘急,而擴(kuò)展的SD卡就是外部存儲(chǔ)。但是從4.4的系統(tǒng)開始浸踩,很多的中高端機(jī)器都將自己的機(jī)身存儲(chǔ)擴(kuò)展到了8G以上叔汁,比如有的人的手機(jī)是16G的,有的人的手機(jī)是32G的民轴,但是這個(gè)16G攻柠,32G是內(nèi)部存儲(chǔ)嗎,不是的:舐恪!冒滩!微驶,它們依然是外部存儲(chǔ),也就是說4.4系統(tǒng)及以上的手機(jī)將機(jī)身存儲(chǔ)存儲(chǔ)(手機(jī)自身帶的存儲(chǔ)叫做機(jī)身存儲(chǔ))在概念上分成了
內(nèi)部存儲(chǔ)internal
和外部存儲(chǔ)external
兩部分开睡。既然16G因苹,32G是外部存儲(chǔ),那有人又有疑惑了篇恒,那4.4系統(tǒng)及以上的手機(jī)要是插了SD卡呢扶檐,SD卡又是什么呢,如果SD卡也是外部存儲(chǔ)的話胁艰,那怎么區(qū)分機(jī)身存儲(chǔ)的外部存儲(chǔ)跟SD卡的外部存儲(chǔ)呢款筑?對(duì),SD卡也是外部存儲(chǔ)腾么,那怎么區(qū)分呢奈梳,在4.4以后的系統(tǒng)中,API提供了這樣一個(gè)方法來遍歷手機(jī)的外部存儲(chǔ)路徑:
File[] files;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
for(File file:files){
Log.e("main",file);
}
}
如果你的手機(jī)插了SD卡的話解虱,那么它打印的路徑就有兩條了攘须,例如華為榮耀7插了SD卡,它的結(jié)果如下:
/storage/emulated/0/Android/data/packname/files/mounted
/storage/B3E4-1711/Android/data/packname/files/mounted
其中 /storage/emulated/0
目錄就是機(jī)身存儲(chǔ)的外部存儲(chǔ)路徑殴泰,而 /storage/B3E4-1711/
就是SD卡的路徑于宙,他們統(tǒng)稱為外部存儲(chǔ)浮驳,那么,訪問外部存儲(chǔ)的API方法有:
(1)Environment.getExternalStorageDirectory().getAbsolutePath()
(2)Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath()
(3)getExternalFilesDir(“”).getAbsolutePath()
(4)getExternalCacheDir().getAbsolutePath()
大家對(duì)Android的外部存儲(chǔ)會(huì)產(chǎn)生疑問捞魁,主要是現(xiàn)在很多的手機(jī)已經(jīng)從物理上看不到外部存儲(chǔ)了抹恳,以前的手機(jī)都有,就是那種黑色的內(nèi)存卡署驻,8G奋献,16G,32G的旺上,可以像U盤一樣插拔瓶蚂,以前很流行,存儲(chǔ)空間不夠了宣吱,就去買個(gè)內(nèi)存卡(準(zhǔn)確說是SD卡窃这,說成內(nèi)存卡又會(huì)引起誤解)回來,后來的手機(jī)比如現(xiàn)在我用的華為榮耀7征候,廠家已經(jīng)把機(jī)身存儲(chǔ)擴(kuò)展到了16G了杭攻,只是在存儲(chǔ)概念上了分為了內(nèi)部存儲(chǔ)(內(nèi)部internal)
和外部存儲(chǔ)(外部external)
,其實(shí)它們都集成在一起了疤坝。
當(dāng)然如果你覺得16G不夠用兆解,那他支持通過插SD卡來擴(kuò)充容量嗎?支持的跑揉,榮耀7為例锅睛,它是三合二卡槽±卡槽1:Nano SIM卡现拒;卡槽2:Nano SIM卡或Micro SD卡。默認(rèn)卡槽1為4G主卡望侈,可以在設(shè)置中更改4G主卡卡槽印蔬;不支持熱插拔,插拔卡托后需重啟手機(jī)脱衙。這樣插入的SD卡也屬于外部存儲(chǔ)侥猬。
- 所以手機(jī)的外部存儲(chǔ)可能包含兩部分,一是機(jī)身存儲(chǔ)的外部存儲(chǔ)部分岂丘,還有一個(gè)是SD卡部分
- 那么外部存儲(chǔ)的目錄在哪呢陵究,在
storage
文件夾中有一個(gè)sdcard
文件夾,這個(gè)文件夾中的文件又分為兩類奥帘,一類是公有目錄铜邮,還有一類是私有目錄,其中的公有目錄有九大類,比如DCIM
松蒜、DOWNLOAD
等這種系統(tǒng)為我們創(chuàng)建的文件夾扔茅,私有目錄就是Android
這個(gè)文件夾,這個(gè)文件夾打開之后里邊有一個(gè)data
文件夾秸苗,打開這個(gè)data
文件夾召娜,里邊有許多包名組成的文件夾。
3.2 清除APP的緩存惊楼,都刪除了哪些文件目錄呢玖瘸?
緩存
是程序運(yùn)行時(shí)的臨時(shí)存儲(chǔ)空間,它可以存放從網(wǎng)絡(luò)下載的臨時(shí)圖片檀咙,從用戶的角度出發(fā)清除緩存對(duì)用戶并沒有太大的影響雅倒,但是清除緩存后用戶再次使用該APP時(shí),由于本地緩存已經(jīng)被清理弧可,所有的數(shù)據(jù)需要重新從網(wǎng)絡(luò)上獲取蔑匣。很多人簡單的認(rèn)為,清除緩存數(shù)據(jù)時(shí)清除的肯定就是cache下的數(shù)據(jù)棕诵,但是事實(shí)卻不是這樣的裁良。我們知道應(yīng)用程序在運(yùn)行過程中需要經(jīng)過很多過程,比如讀入程序校套,計(jì)算价脾,輸入輸出等等,這些過程中肯定會(huì)產(chǎn)生很多的數(shù)據(jù)搔确,它們?cè)趦?nèi)存中彼棍,以供程序運(yùn)行時(shí)調(diào)用。所以清除緩存清除的是APP運(yùn)行過程中所產(chǎn)生的臨時(shí)數(shù)據(jù)膳算。
不過為了保證在清除緩存的時(shí)候,能夠正常清除與應(yīng)用相關(guān)的緩存弛作,我們一般將緩存文件存放在
getCacheDir()
或者getExternalCacheDir()
路徑下涕蜂。
3.3 清除APP的數(shù)據(jù),又刪除了哪些文件目錄呢映琳?
清除數(shù)據(jù)
清除的是保存在app中所有數(shù)據(jù)机隙,就是上面提到的位于packagename
下面的所有文件,內(nèi)部存儲(chǔ)(/data/data/packagename/
)和外部存儲(chǔ)(/storage/emulated/0/Android/data/packagename/
)萨西, 包括cache有鹿,files,lib谎脯,shared_prefs等等葱跋。當(dāng)然除了SD卡上面的數(shù)據(jù)懈息,SD卡上面的數(shù)據(jù)當(dāng)app卸載之后還會(huì)存在的结啼。
3.4 哪些文件目錄是APP私有的,哪些又是公共的目錄?
內(nèi)部存儲(chǔ)空間, 通過 Context.getFileDir()或 Context.getCacheDir() 獲取到的目錄舵变,絕對(duì)是APP私有的,其他進(jìn)程是無法訪問的幻林;
外部存儲(chǔ)控件的私有目錄瑞你,比方說通過
Context.externalCacheDirs
獲取的緩存目錄,也是私有的油宜,但是掂碱,其他進(jìn)程可以通過路徑進(jìn)行訪問,只不過無法通過Context進(jìn)行訪問了慎冤;外部存儲(chǔ)控件的公共目錄疼燥,是純粹的共有的資源了,任意進(jìn)程都可以進(jìn)行訪問粪薛,比如
Environment.getDataDirectory()
獲取用戶數(shù)據(jù)目錄的路徑悴了。
3.5 SharedPreferences、數(shù)據(jù)庫一般都存儲(chǔ)在什么目錄违寿?
- 既然是涉及到APP的私有數(shù)據(jù)湃交,而且是數(shù)據(jù)庫這么重要的東西,那肯定是存儲(chǔ)在內(nèi)部存儲(chǔ)中比較安全了藤巢,所以搞莺,SharedPreferences存儲(chǔ)在
"/data/data/Android/packagename/shared_prefs/xxx.xml"
文件中,數(shù)據(jù)庫存儲(chǔ)在"/data/data/Android/packagename/databases/xxx.xml"
文件中掂咒。 - 如果真有向其他進(jìn)程共享數(shù)據(jù)的情況才沧,可以通過ContentProvider進(jìn)行提供。
3.6 getFilesDir().getAbsolutePath()和getCacheDir().getAbsolutePath()有什么區(qū)別呢绍刮?
我們知道 getFilesDir()
和 getCacheDir()
是都獲取內(nèi)部存儲(chǔ)的相關(guān)目錄温圆,只不過 getFilesDir()
獲取的是files目錄,getCacheDir()
獲取的是cache目錄孩革,它們位于同一級(jí)目錄岁歉,只是為了用來存放不同類型的數(shù)據(jù)的,由文件名不難看出:cache
下存放緩存數(shù)據(jù)膝蜈,databases
下存放使用SQLite存儲(chǔ)的數(shù)據(jù)锅移,files
下存放普通數(shù)據(jù)(log數(shù)據(jù),json型數(shù)據(jù)等)饱搏,shared_prefs
下存放使用SharedPreference存放的數(shù)據(jù)非剃。這些文件夾都是由系統(tǒng)創(chuàng)建的。APP被卸載或者刪除數(shù)據(jù)時(shí)推沸,這些目錄下的文件都會(huì)被清除备绽。
3.7 getFilesDir().getAbsolutePath()和getExternalFilesDir(“”).getAbsolutePath()有什么區(qū)別呢券坞?
我們先看它們的路徑:
/data/user/0/packname/files
/storage/emulated/0/Android/data/packname/files
很顯然這兩個(gè)的區(qū)別是一個(gè)在內(nèi)部存儲(chǔ)里面,一個(gè)在外部存儲(chǔ)里面疯坤,這是它們的區(qū)別报慕。它們的共同點(diǎn)呢,就是它們的路徑都帶有包名压怠,表明是這個(gè)APP的專屬文件眠冈,這類文件應(yīng)該是隨著app卸載而一起被刪除的,并且我們?cè)谠O(shè)置里面清除該應(yīng)用的數(shù)據(jù)時(shí)菌瘫,這兩個(gè)文件夾下的數(shù)據(jù)都會(huì)被清除蜗顽。
3.8 什么是APP專屬文件?
所謂專屬文件就是它是屬于某個(gè)具體的應(yīng)用的雨让,他的文件路徑都帶有相應(yīng)的包名雇盖,當(dāng)APP卸載時(shí),它們會(huì)隨應(yīng)用一起刪除栖忠,當(dāng)我們?cè)谠O(shè)置里面手動(dòng)清除某個(gè)應(yīng)用數(shù)據(jù)時(shí)(不是清除緩存)崔挖,它們也會(huì)一起被清掉。Android使用這種專屬文件的目的就是為了方便文件管理庵寞,避免文件隨意存儲(chǔ)狸相,顯得很亂,另一個(gè)目的就是為了當(dāng)應(yīng)用被卸載時(shí)不會(huì)留下很多垃圾文件捐川。
3.9 既然內(nèi)部存儲(chǔ)與外部存儲(chǔ)都有APP專屬文件脓鹃,那么我們?cè)搩?yōu)先使用哪個(gè)呢?
內(nèi)部存儲(chǔ)與外部存儲(chǔ)都有APP專屬文件古沥,我們?cè)撚媚膫€(gè)呢瘸右,很顯然應(yīng)該用外部存儲(chǔ)的,因?yàn)閮?nèi)部存儲(chǔ)本身就比較小岩齿,而且已經(jīng)存儲(chǔ)了一些系統(tǒng)的文件太颤,因此內(nèi)部存儲(chǔ)我們盡量不要去使用。
但是當(dāng)手機(jī)沒有外部存儲(chǔ)時(shí)盹沈,我們還是得使用內(nèi)部存儲(chǔ)栋齿,一般程序員會(huì)做判斷是否有外部存儲(chǔ),沒有再使用內(nèi)部存儲(chǔ)襟诸,代碼如下:
public static String getFilePath(Context context,String dir) {
String directoryPath="";
if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ) {//判斷外部存儲(chǔ)是否可用
directoryPath =context.getExternalFilesDir(dir).getAbsolutePath();
}else{//沒外部存儲(chǔ)就使用內(nèi)部存儲(chǔ)
directoryPath=context.getFilesDir()+File.separator+dir;
}
File file = new File(directoryPath);
if(!file.exists()){//判斷文件目錄是否存在
file.mkdirs();
}
return directoryPath;
}
- 還有種情況,我們要保存數(shù)據(jù)庫這種重要數(shù)據(jù)基协,那么應(yīng)該也會(huì)選擇內(nèi)部存儲(chǔ)了歌亲。
3.10 /storage/sdcard,/sdcard澜驮,/mnt/sdcard陷揪,/storage/emulated/0之間的關(guān)系
簡單的說,是Android系統(tǒng)開發(fā)者為了兼容不同的版本,做出的結(jié)果悍缠。這些路徑都是同一個(gè)路徑的不同 ”指針“卦绣,指向的是同一個(gè)地方,只是不同Android版本的叫法不一樣飞蚓。具體分析參考:https://blog.csdn.net/u010937230/article/details/73303034
最后附上參考的文章