Android 文件存儲(chǔ)

一、前言

最近在項(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官方文檔提示羞福,getExternalStorageDirectorygetExternalStoragePublicDirectory已經(jīng)被標(biāo)記為棄用,可以使用 Context.getExternalFilesDir(String)蚯涮、MediaStoreIntent.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 // 文檔

附上一張外部公共目錄的截圖:

39.png

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

最后附上參考的文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市趴拧,隨后出現(xiàn)的幾起案子溅漾,更是在濱河造成了極大的恐慌,老刑警劉巖著榴,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件添履,死亡現(xiàn)場離奇詭異,居然都是意外死亡脑又,警方通過查閱死者的電腦和手機(jī)暮胧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來问麸,“玉大人往衷,你說我怎么就攤上這事】谛穑” “怎么了炼绘?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妄田。 經(jīng)常有香客問我俺亮,道長,這世上最難降的妖魔是什么疟呐? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任脚曾,我火速辦了婚禮,結(jié)果婚禮上启具,老公的妹妹穿的比我還像新娘本讥。我一直安慰自己,他們只是感情好鲁冯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布拷沸。 她就那樣靜靜地躺著,像睡著了一般薯演。 火紅的嫁衣襯著肌膚如雪撞芍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天跨扮,我揣著相機(jī)與錄音序无,去河邊找鬼验毡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛帝嗡,可吹牛的內(nèi)容都是我干的晶通。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼哟玷,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼狮辽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碗降,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤隘竭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后讼渊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體动看,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年爪幻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了菱皆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挨稿,死狀恐怖仇轻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奶甘,我是刑警寧澤篷店,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站臭家,受9級(jí)特大地震影響疲陕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钉赁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一蹄殃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧你踩,春花似錦诅岩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至膝藕,卻和暖如春逮京,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背束莫。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工懒棉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人览绿。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓策严,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饿敲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妻导,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348