徹底搞懂Android文件存儲---內(nèi)部存儲故痊,外部存儲以及各種存儲路徑解惑(轉(zhuǎn))

前言:

對于任何一個應(yīng)用來說,無論是PC端應(yīng)用還是Android應(yīng)用玖姑,存儲肯定是必不可少的愕秫。對于很多做Android開發(fā)的同學來說,可能認為文件存儲很簡單客峭,調(diào)用一些諸如getFilesDir豫领,getExternalStorageDirectory方法行了,但是雖然說它們會調(diào)用相應(yīng)的方法來實現(xiàn)簡單的數(shù)據(jù)存儲舔琅。但是他們未必就搞懂了他的數(shù)據(jù)到底存在了哪里等恐,以及他的數(shù)據(jù)是否存對了地方,或者是否做好了版本兼容备蚓。

下面我將從這幾個地方來解答大家常見的困惑:
1课蔬、Android中內(nèi)部存儲,外部存儲的概念
2郊尝、不同安卓版本下getDataDirectory二跋,getFilesDir,getCacheDir流昏,getDir扎即,getExternalStorageDirectory,getExternalStoragePublicDirectory况凉,getExternalFilesDir谚鄙,getExternalCacheDir,getExternalCacheDir刁绒,getRootDirectory等方法的區(qū)別和聯(lián)系
3闷营、清除數(shù)據(jù)和清除緩存到底清除了什么數(shù)據(jù)
4、/storage/sdcard,/sdcard傻盟,/mnt/sdcard速蕊,/storage/emulated/0之間的關(guān)系
5、一張圖看懂Ram娘赴,Rom规哲,以及擴展存儲(TF卡)的區(qū)別;內(nèi)部存儲诽表,外部存儲的區(qū)別媳叨。

一、Android中內(nèi)部存儲关顷,外部存儲的概念

內(nèi)部存儲

概念:注意內(nèi)部存儲不是內(nèi)存。內(nèi)部存儲位于系統(tǒng)中很特殊的一個位置武福,如果你想將文件存儲于內(nèi)部存儲中议双,那么文件默認只能被你的應(yīng)用訪問到,且一個應(yīng)用所創(chuàng)建的所有文件都在和應(yīng)用包名相同的目錄下捉片。也就是說應(yīng)用創(chuàng)建于內(nèi)部存儲的文件平痰,與這個應(yīng)用是關(guān)聯(lián)起來的。當一個應(yīng)用卸載之后伍纫,內(nèi)部存儲中的這些文件也被刪除宗雇。從技術(shù)上來講如果你在創(chuàng)建內(nèi)部存儲文件的時候?qū)⑽募傩栽O(shè)置成可讀,其他app能夠訪問自己應(yīng)用的數(shù)據(jù)莹规,前提是他知道你這個應(yīng)用的包名赔蒲,如果一個文件的屬性是私有(private),那么即使知道包名其他應(yīng)用也無法訪問良漱。 內(nèi)部存儲空間十分有限舞虱,因而顯得可貴,另外母市,它也是系統(tǒng)本身和系統(tǒng)應(yīng)用程序主要的數(shù)據(jù)存儲所在地矾兜,一旦內(nèi)部存儲空間耗盡,手機也就無法使用了患久。所以對于內(nèi)部存儲空間椅寺,我們要盡量避免使用。Shared Preferences和SQLite數(shù)據(jù)庫都是存儲在內(nèi)部存儲空間上的蒋失。內(nèi)部存儲一般用Context來獲取和操作返帕。
訪問內(nèi)部存儲的API方法:
1、Environment.getDataDirectory()
2高镐、getFilesDir().getAbsolutePath()
3溉旋、getCacheDir().getAbsolutePath()
4、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath()

外部存儲

概念:最容易混淆的是外部存儲嫉髓,因為老的Android系統(tǒng)的跟新的Android系統(tǒng)是有差別的观腊,很多人去網(wǎng)上查找資料邑闲,看了一下以前的資料,又看了一下現(xiàn)在的資料梧油,但是發(fā)現(xiàn)它們說法不一樣然后就困惑了苫耸。首先說一個大家普遍的概念“如果在pc機上是區(qū)分外部存儲和內(nèi)部存儲的話,那么電腦自帶的硬盤算是內(nèi)部存儲儡陨,U盤或者移動硬盤就是外部存儲了褪子。”因此很多人帶著這樣的理解去看待安卓手機骗村,把內(nèi)置存儲(機身存儲)當做內(nèi)部存儲嫌褪,而把擴展的SD卡當做是外部存儲。這么認為確實沒錯胚股,因為在4.4(API19)以前的手機上確實是這樣的笼痛,手機自身帶的存儲卡就是內(nèi)部存儲,而擴展的SD卡就是外部存儲琅拌。但是從4.4的系統(tǒng)開始缨伊,很多的中高端機器都將自己的機身存儲擴展到了8G以上,比如有的人的手機是16G的进宝,有的人的手機是32G的刻坊,但是這個16G,32G是內(nèi)部存儲嗎党晋,不是的L放摺!未玻!漏益,它們依然是外部存儲,也就是說4.4系統(tǒng)及以上的手機將機身存儲存儲(手機自身帶的存儲叫做機身存儲)在概念上分成了”內(nèi)部存儲internal” 和”外部存儲external” 兩部分深胳。既然16G绰疤,32G是外部存儲,那有人又有疑惑了舞终,那4.4系統(tǒng)及以上的手機要是插了SD卡呢轻庆,SD卡又是什么呢,如果SD卡也是外部存儲的話敛劝,那怎么區(qū)分機身存儲的外部存儲跟SD卡的外部存儲呢余爆?對,SD卡也是外部存儲夸盟,那怎么區(qū)分呢蛾方,在4.4以后的系統(tǒng)中,API 提供了這樣一個方法來遍歷手機的外部存儲路徑:

File[] files;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
    for(File file:files){
        Log.e("main",file);
    }
}

如果你的手機插了SD卡的話,那么它打印的路徑就有兩條了桩砰,例如我的華為榮耀7插了SD卡拓春,它的結(jié)果如下:

/storage/emulated/0/Android/data/packname/files/mounted 
/storage/B3E4-1711/Android/data/packname/files/mounted 

其中/storage/emulated/0目錄就是機身存儲的外部存儲路徑
而/storage/B3E4-1711/就是SD卡的路徑
他們統(tǒng)稱為外部存儲

訪問外部存儲的API方法:

1、Environment.getExternalStorageDirectory().getAbsolutePath()
2亚隅、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath()
3硼莽、getExternalFilesDir(“”).getAbsolutePath()
4、getExternalCacheDir().getAbsolutePath()

大家對Android的外部存儲會產(chǎn)生疑問煮纵,主要是現(xiàn)在很多的手機已經(jīng)從物理上看不到外部存儲了懂鸵,以前的手機都有,就是那種黑色的內(nèi)存卡行疏,8G匆光,16G,32G的酿联,可以像U盤一樣插拔殴穴,以前很流行,存儲空間不夠了货葬,就去買個內(nèi)存卡(準確說是SD卡,說成內(nèi)存卡又會引起誤解)回來劲够,后來的手機比如現(xiàn)在我用的華為榮耀7震桶,廠家已經(jīng)把機身存儲擴展到了16G了,只是在存儲概念上了分為了內(nèi)部存儲(內(nèi)部internal)和外部存儲(外部external)征绎,其實它們都集成在一起了蹲姐。當然如果你覺得16G不夠用,那他支持通過插SD卡來擴充容量嗎人柿?支持的柴墩,榮耀7為例,它是三合二卡槽凫岖〗龋卡槽1:Nano SIM卡;卡槽2:Nano SIM卡或Micro SD卡哥放。默認卡槽1為4G主卡歼指,可以在設(shè)置中更改4G主卡卡槽;不支持熱插拔甥雕,插拔卡托后需重啟手機踩身。這樣插入的SD卡也屬于外部存儲。所以手機的外部存儲可能包含兩部分社露,一是機身存儲的外部存儲部分挟阻,還有一個是SD卡部分

不同Android版本下getDataDirectory,getFilesDir,getCacheDir附鸽,getDir脱拼,getExternalStorageDirectory,getExternalStoragePublicDirectory拒炎,getExternalFilesDir挪拟,getExternalCacheDir,getExternalCacheDir击你,getRootDirectory的區(qū)別和聯(lián)系

上面這些方法玉组,我們可能似曾相識,但是對于有些同學來說卻又很難分清出丁侄,主要還是不同的Android版本的問題惯雳。為了方便大家理解,我先簡要介紹以上各個方法鸿摇,為方便大家理解我把這些方法的結(jié)果打印出來(以下的打印結(jié)果是基于榮耀7的(系統(tǒng)版本6.0):
1石景、Environment.getDataDirectory() = /data
這個方法是獲取內(nèi)部存儲的根路徑
2、getFilesDir().getAbsolutePath() = /data/user/0/packname/files
這個方法是獲取某個應(yīng)用在內(nèi)部存儲中的files路徑
3拙吉、getCacheDir().getAbsolutePath() = /data/user/0/packname/cache
這個方法是獲取某個應(yīng)用在內(nèi)部存儲中的cache路徑
4潮孽、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath() = /data/user/0/packname/app_myFile
這個方法是獲取某個應(yīng)用在內(nèi)部存儲中的自定義路徑
方法2,3,4的路徑中都帶有包名,說明他們是屬于某個應(yīng)用


5筷黔、Environment.getExternalStorageDirectory().getAbsolutePath() = /storage/emulated/0
這個方法是獲取外部存儲的根路徑
6往史、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath() = /storage/emulated/0
這個方法是獲取外部存儲的根路徑
7、getExternalFilesDir(“”).getAbsolutePath() = /storage/emulated/0/Android/data/packname/files
這個方法是獲取某個應(yīng)用在外部存儲中的files路徑
8佛舱、getExternalCacheDir().getAbsolutePath() = /storage/emulated/0/Android/data/packname/cache
這個方法是獲取某個應(yīng)用在外部存儲中的cache路徑
注意:其中方法7和方法8如果在4.4以前的系統(tǒng)中g(shù)etExternalFilesDir(“”)和getExternalCacheDir()將返回null椎例,如果是4.4及以上的系統(tǒng)才會返回上面的結(jié)果,也即4.4以前的系統(tǒng)沒插SD卡的話请祖,就沒有外部存儲订歪,它的SD卡就等于外部存儲;而4.4及以后的系統(tǒng)外部存儲包括兩部分肆捕,getExternalFilesDir(“”)和getExternalCacheDir()獲取的是機身存儲的外部存儲部分刷晋,也即4.4及以后的系統(tǒng)你不插SD卡,它也有外部存儲慎陵,既然getExternalFilesDir(“”)和getExternalCacheDir()獲取的是機身存儲的外部存儲部分掏秩,那么怎么獲取SD卡的存儲路徑呢,還是通過上面提到的getExternalFilesDirs(Environment.MEDIA_MOUNTED)方法來獲取了荆姆,不知道Android有沒有提供相關(guān)的API接口來獲取SD卡的存儲路徑蒙幻,大家可以去查資料。又重復了上面的話胆筒,主要是提醒大家要注意不同的Android版本是有差別的邮破,這個最坑了诈豌。


Environment.getDownloadCacheDirectory() = /cache
Environment.getRootDirectory() = /system
這兩個方法沒什么說的了,每個版本的android系統(tǒng)都一樣


從上面我們很清楚的可以看到上面的方法可以分為三類抒和,我用橫線隔開了矫渔。第一類是位于根目錄/data下;還有一類是位于根目錄/storage下摧莽,可以看到調(diào)用它們的API方法都帶了一個External庙洼;另外一類不在/data下也不再/storage下,比如系統(tǒng)文件/system镊辕,或者緩存文件/cache油够。
/data目錄下的文件物理上存放在我們通常所說的內(nèi)部存儲里面
/storage目錄下的文件物理上存放在我們通常所說的外部存儲里面
/system用于存放系統(tǒng)文件,/cache用于存放一些緩存文件征懈,物理上它們也是存放在內(nèi)部存儲里面的

下面來看一下大家常見的疑問

疑問1石咬、那getFilesDir().getAbsolutePath()和getCacheDir().getAbsolutePath()有什么區(qū)別呢?

其實是沒有什么區(qū)別的卖哎,我們可以看下面一張圖:

image.png

getFilesDir獲取的是files目錄鬼悠,getCacheDir獲取的是cache目錄,它們位于同一級目錄亏娜,只是為了用來存放不同類型的數(shù)據(jù)的焕窝,由文件名不難看出:cache下存放緩存數(shù)據(jù),databases下存放使用SQLite存儲的數(shù)據(jù)维贺,files下存放普通數(shù)據(jù)(log數(shù)據(jù)它掂,json型數(shù)據(jù)等),shared_prefs下存放使用SharedPreference存放的數(shù)據(jù)幸缕。這些文件夾都是由系統(tǒng)創(chuàng)建的。

疑問2晰韵、getFilesDir().getAbsolutePath()和getExternalFilesDir(“”).getAbsolutePath()有什么區(qū)別呢发乔?

我們先看它們的路徑:
/data/user/0/packname/files
/storage/emulated/0/Android/data/packname/files
很顯然這兩個的區(qū)別是一個在內(nèi)部存儲里面,一個在外部存儲里面雪猪,這是它們的區(qū)別栏尚。它們的共同點呢,就是它們的路徑都帶有包名只恨,表明是這個APP的專屬文件译仗,這類文件應(yīng)該是隨著app卸載而一起被刪除的,并且我們在設(shè)置里面清除該應(yīng)用的數(shù)據(jù)時官觅,這兩個文件夾下的數(shù)據(jù)都會被清除纵菌。

疑問3、什么是APP專屬文件休涤?

上面疑問2我們提到了專屬文件咱圆,所謂專屬文件就是它是屬于某個具體的應(yīng)用的笛辟,他的文件路徑都帶有相應(yīng)的包名,當APP卸載時序苏,它們會隨應(yīng)用一起刪除手幢,當我們在設(shè)置里面手動清除某個應(yīng)用數(shù)據(jù)時(不是清除緩存),它們也會一起被清掉忱详。Android使用這種專屬文件的目的就是為了方便文件管理围来,避免文件隨意存儲,顯得很亂匈睁,另一個目的就是為了當應(yīng)用被卸載時不會留下很多垃圾文件监透。
疑問4、既然內(nèi)部存儲與外部存儲都有APP專屬文件软舌,那么我們該使用哪個呢才漆?
內(nèi)部存儲與外部存儲都有APP專屬文件,我們該用哪個呢佛点,很顯然應(yīng)該用外部存儲的醇滥,因為內(nèi)部存儲本身就比較小,而且已經(jīng)存儲了一些系統(tǒng)的文件超营,因此內(nèi)部存儲我們盡量不要去使用鸳玩。但是當手機沒有外部存儲時,我們還是得使用內(nèi)部存儲演闭,一般程序員會做判斷是否有外部存儲不跟,沒有再使用內(nèi)部存儲,代碼如下:

public static String getFilePath(Context context,String dir) {
    String directoryPath="";
    if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ) {//判斷外部存儲是否可用 
        directoryPath =context.getExternalFilesDir(dir).getAbsolutePath();
        }else{//沒外部存儲就使用內(nèi)部存儲  
        directoryPath=context.getFilesDir()+File.separator+dir;
        }
        File file = new File(directoryPath);
        if(!file.exists()){//判斷文件目錄是否存在
        file.mkdirs();
        }
    return directoryPath;
}

為了讓大家更好地理解不同版本的Android系統(tǒng)的存儲差異我做了下列一份說明表:
比較的是我向getFilesDir().getAbsolutePath()路徑下和getExternalFilesDir(“”).getAbsolutePath()路徑各寫入19.48M數(shù)據(jù)前后的差別

表一米碰、4.1.1系統(tǒng)窝革,帶有SD卡 (真機)

存儲位置 獲取路徑的方法 容量(寫入前) 容量(寫入后) 備注
/data/data/packname/files getFilesDir() 1.59GB 1.57GB 內(nèi)部存儲
/storage/sdcard0/Android
/data/packname/files getExternal
StorageDirectory() 1.47GB 1.45GB 外部存儲(SD卡)
表二、4.1.1系統(tǒng)吕座,不帶有SD卡 (真機)

存儲位置 獲取路徑的方法 容量(寫入前) 容量(寫入后) 備注
/data/data/packname/files getFilesDir() 1.59GB 1.47GB 內(nèi)部存儲
路徑不存在 getExternal
StorageDirectory() ~~~ ~~~ 沒插SD卡

表三虐译、4.2.1系統(tǒng),帶有SD卡 (模擬器)

存儲位置 獲取路徑的方法 容量(寫入前) 容量(寫入后) 備注
/data/data/packname/files getFilesDir() 1.85GB 1.83GB 內(nèi)部存儲
/mnt/sdcard/Android
/data/packname/files getExternal
StorageDirectory() 98.42MB 78.93MB 外部存儲(SD卡)

表四吴趴、4.4.2系統(tǒng)漆诽,帶有SD卡 (真機)

存儲位置 獲取路徑的方法 容量(寫入前) 容量(寫入后) 備注
/data/data/packname/files getFilesDir() 2.22GB 2.18GB 內(nèi)部存儲
/storage/emulated/0/Android
/data/packname/files getExternal
StorageDirectory() 2.20GB 2.16GB 機身外部存儲
/storage/sdcard1 getExternalFilesDirs 1.47GB 1.47GB 外部存儲(SD卡
沒有向其寫數(shù)據(jù),只是讀嚷嘀Α)

表五厢拭、4.4.2系統(tǒng),不帶有SD卡 (真機)

存儲位置 獲取路徑的方法 容量(寫入前) 容量(寫入后) 備注
/data/data/packname/files getFilesDir() 2.22GB 2.18GB 內(nèi)部存儲
/storage/emulated/0/Android
/data/packname/files getExternal
StorageDirectory() 2.20GB 2.16GB 機身外部存儲
表六撇叁、6.0.0系統(tǒng)供鸠,帶有SD卡 (真機)

存儲位置 獲取路徑的方法 容量(寫入前) 容量(寫入后) 備注
/data/user/0/packname/files getFilesDir() 11.94GB 11.90GB 內(nèi)部存儲
/storage/emulated/0/Android
/data/packname/files getExternal
StorageDirectory() 11.92GB 11.88GB 機身外部存儲
/storage/B3E4-1711 getExternalFilesDirs 1.47GB 1.47GB 外部存儲(SD卡)
沒有向其寫數(shù)據(jù),只是讀取
表七陨闹、6.0.0系統(tǒng)回季,不帶有SD卡 (真機)

存儲位置 獲取路徑的方法 容量(寫入前) /storage/容量(寫入后) 備注
/data/user/0/packname/files getFilesDir() 11.93GB 11.89GB 內(nèi)部存儲
/storage/emulated/0/Android
/data/packname/files getExternal
StorageDirectory() 11.91GB 11.87GB 機身外部存儲
注:上述容量指的是該路徑所在根路徑的可用容量家制,比如/data/data/packname/files的容量是指/data的可用容量,/storage/sdcard0/Android/data/packname/files指的是/storage/sdcard0的可用容量泡一,而一般在4.4及以上的系統(tǒng)中颤殴,我們很少操作SD

三、清除數(shù)據(jù)和清除緩存到底清除了什么數(shù)據(jù)

這個很容易搞混鼻忠,為什么呢涵但?通過上面我們知道:
/data/user/0/packname/files它是用來存儲普通數(shù)據(jù)的
/data/user/0/packname/cache它是用來存儲緩存數(shù)據(jù)的
所以很多人就以為我清除數(shù)據(jù)時清除的肯定就是files下的數(shù)據(jù),而我清除緩存數(shù)據(jù)時清除的肯定就是cache下的數(shù)據(jù)帖蔓,但是事實卻不是這樣的矮瘟。正確應(yīng)該是:
清除緩存:我們知道應(yīng)用程序在運行過程中需要經(jīng)過很多過程,比如讀入程序塑娇,計算澈侠,輸入輸出等等,這些過程中肯定會產(chǎn)生很多的數(shù)據(jù)埋酬,它們在內(nèi)存中哨啃,以供程序運行時調(diào)用。所以清除緩存清除的是APP運行過程中所產(chǎn)生的臨時數(shù)據(jù)写妥。
清除數(shù)據(jù):清除數(shù)據(jù)才是真正的刪除了我們保存在文件中的數(shù)據(jù)(永久性數(shù)據(jù)拳球,如果不人為刪除的話會一直保存在文件中)例如當我們在設(shè)置里面清除了某個應(yīng)用的數(shù)據(jù),那么/data/user/0/packname/和/storage/emulated/0/Android/data/packname/下的文件里面的數(shù)據(jù)會全部刪除珍特,包括cache祝峻,files,lib扎筒,shared_prefs等等莱找。

四、/storage/sdcard嗜桌,/sdcard奥溺,/mnt/sdcard,/storage/emulated/0之間的關(guān)系

從上面的表中我們可以發(fā)現(xiàn)症脂,在4.1系統(tǒng)中谚赎,getExternalStorageDirectory方法獲取到的路徑為/storage/sdcard0淫僻;4.2系統(tǒng)中g(shù)etExternalStorageDirectory方法獲取到的路徑為/mnt/sdcard诱篷,因為4.2是模擬器打印的結(jié)果,如果是真機的話也是/storage/sdcard0雳灵;4.4的getExternalStorageDirectory方法獲取到的路徑為/storage/emulated/0棕所,它的SD卡存儲路徑為/storage/sdcard1;6.0的getExternalStorageDirectory方法獲取到的路徑為/storage/emulated/0悯辙,它的SD卡存儲路徑為/storage/B3E4-1711琳省;另外根據(jù)測試在4.0上getExternalStorageDirectory方法獲取到的路徑為/mnt/sdcard迎吵。所以在真機上,getExternalStorageDirectory獲取到的路徑如下表所示:

系統(tǒng)版本 結(jié)果
4.0 /mnt/sdcard
4.1 /storage/sdcard0
4.2 /storage/sdcard0
4.4 /storage/emulated/0
6.0 /storage/emulated/0
要理解/storage/sdcard针贬,/sdcard击费,/mnt/sdcard,/storage/emulated/0之間的關(guān)系桦他,我們需要先要了解一下linux文件掛載的概念蔫巩,關(guān)于掛載大家可以自行去百度。還有我們不明白為什么會有有/storage/sdcard快压,/sdcard圆仔,/mnt/sdcard,/storage/emulated/0這么多目錄蔫劣,讓人看起來眼花繚亂坪郭,要詳細了解請仔細看下面的文章,下面的文章是我摘自關(guān)于android的4.2的0文件夾的詳解
—- android 4.0 —-
在galaxy nexus(GN)手機上userdata分區(qū)很大脉幢,被掛在/data目錄等浊,用戶的數(shù)據(jù)通常是放在sd卡上,然而gn是沒有sd卡的培他,所以google想了一個辦法荒典,就是虛擬一個。
所以豆瘫,在userdata分區(qū)下有個目錄叫media珊蟀,是內(nèi)置sd卡的數(shù)據(jù)存儲位置,使用fuse技術(shù)將/data/media虛擬成為一個叫做/dev/fuse的設(shè)備外驱,為了讓程序能認出來育灸,被同時掛載在 /mnt/sdcard 目錄,又為了兼容以前的程序昵宇,做了一個快捷方式(linux系統(tǒng)里叫軟連接) /sdcard 指向的是 /mnt/sdcard .
當然磅崭,這些都是4.0的做法。
—- android 4.1 —-
在4.1里瓦哎,同樣也會使用fuse技術(shù)砸喻,/dev/fuse 會被同時掛載到/storage/sdcard0 目錄,這個sdcard0表示第一個sd卡(如果有外置sd卡蒋譬,那會多一個 /storage/sdcard1割岛,比如我的xoom), /sdcard 軟連接會指向 /storage/sdcard0 犯助,此時/mnt/sdcard 也是個軟連接癣漆,會指向/storage/sdcard0。
如果你通過otg線接U盤剂买,會被掛載到 /storage/usb0目錄惠爽,stickmount這個軟件為了讓圖庫癌蓖、快圖、mx player等軟件婚肆,能看到u盤里的數(shù)據(jù)租副,又同時掛載到 /storage/sdcard0/usStorage/sda1.
也許你會問,為什么不是usb0较性,而是sda1附井,這是linux的對硬盤的命名方式,如果你的u盤有多個分區(qū)两残,就分別是sda1,sda2這樣一直排下去了永毅。
—- android 4.2 —-
好了,我們開始說4.2系統(tǒng)人弓。
谷歌是不是沒事干啊沼死,非要給android搞個多用戶,你想想啊崔赌,在中國意蛀,可能因為經(jīng)濟問題,家里不是每人一個電腦健芭,在美國县钥,幾乎需要用電腦的人,都會自己有一臺或多臺慈迈,一臺電腦多人用的情況少之又少若贮,這就是為什么叫PC了,顧名思義痒留,個人電腦谴麦。像手機和平板這些東西,更加私人化了伸头,很少公用了吧匾效,我想在中國也是如此吧。
當然恤磷,谷歌也不完全是抽風面哼,因為他有更大的戰(zhàn)略部署,而且平板也的確有多人用的可能扫步。
所以谷歌搞出來一個多用戶魔策,那每個人的應(yīng)用、數(shù)據(jù)锌妻、個性配置都要分開吧代乃。 應(yīng)用和個性配置好弄旬牲,想想啊仿粹,通過權(quán)限控制搁吓,每人只能看自己的應(yīng)用就行了,桌面也可以用自己的吭历。
那數(shù)據(jù)怎么辦堕仔??晌区?摩骨?
好吧,調(diào)整用戶數(shù)據(jù)的掛載結(jié)構(gòu)朗若。android 4.2恼五,同樣也會使用fuse技術(shù)/dev/fuse 會被掛載到/storage/emulated/0 目錄,為什么是0呢哭懈,你還記得上邊的sdcard0吧灾馒,第一個的意思。(如果有第二個遣总,應(yīng)該就是/storage/emulated/1睬罗,我們的三兒子沒有外置sd卡,所以沒法驗證)
為了兼容以前旭斥,同時掛載到 /storage/emulated/legacy (故名思議容达,傳統(tǒng)的),還建立三個軟連接 /storage/sdcard0 垂券,/sdcard花盐,/mnt/sdcard ,都指向 /storage/emulated/legacy
很多同學可能不會認真看上面菇爪,這里我就簡單總結(jié)一下:
1卒暂、其中sdcard/、mnt/sdcard娄帖、storage/sdcard0也祠、storage/emulated/0、storage/emulated/legacy都是同一個路徑的不同”指針“近速,指向的是同一個地方诈嘿,只是不同Android版本的叫法不一樣。
2削葱、如果大家想了解每個版本的外部存儲路徑奖亚,同學們可以通過獲取getExternalStorageDirectory方法的打印結(jié)果進行對比

五、一張圖看懂Ram析砸,Rom昔字,以及擴展存儲(TF卡)的區(qū)別;內(nèi)部存儲,外部存儲的區(qū)別作郭。

image.png

1陨囊、首先我們來弄清幾個概念,內(nèi)存夹攒,內(nèi)部存儲蜘醋,外部存儲,機身存儲(內(nèi)置存儲)咏尝。
1.1內(nèi)存压语;我們在英文中稱作memory,內(nèi)存是計算機中重要的部件之一编检,它是與CPU進行溝通的橋梁胎食。計算機中所有程序的運行都是在內(nèi)存中進行的,所以說它是用于計算機運行時的允懂,它不是用來存儲數(shù)據(jù)的斥季。
1.2內(nèi)部存儲,外部存儲累驮;內(nèi)部存儲我們稱為InternalStorage酣倾,外部我們稱為ExternalStorage,這兩個概念來自于早期的Android智能機谤专,4.4以前躁锡,內(nèi)置存儲就是內(nèi)部存儲,外置SD卡就是外置存儲置侍。我們通過getDataDirectory就可以獲取內(nèi)置存儲根路徑映之,通過getExternalStorageDirectory就可以獲取外置SD卡根路徑。4.4以后外部存儲就包含兩部分了蜡坊,其中通過getExternalStorageDirectory獲取的是機身存儲的外部存儲杠输,而外置SD卡我們則需要通過getExternalDirs遍歷來獲取了。
1.3機身存儲秕衙;機身存儲是指手機自身攜帶的存儲空間蠢甲,出廠時就已經(jīng)有了,4.4以前機身存儲就是內(nèi)部存儲据忘,4.4及以后機身存儲包含了內(nèi)部存儲和外部存儲鹦牛。
2、Ram勇吊,Rom曼追,以及擴展存儲(TF卡)的概念。從圖中我們可以看到汉规,一個手機里面有內(nèi)存礼殊,手機內(nèi)置存儲,以及SD卡, 它們分別是Ram晶伦,Rom碟狞,以及TF卡,這三種卡的性能坝辫,材質(zhì)及價格都不一樣,都有各自的用處射亏。
3近忙、內(nèi)部存儲,外部存儲的概念智润。很多人對這個存在誤解及舍,認為機身存儲就是內(nèi)存,而SD卡才叫外部存儲窟绷,這其實是不對的锯玛,不同的Android版本是有差別的,請看第1條兼蜈。

最后附上我的例子:
http://download.csdn.net/download/u010937230/9930396
————————————————
版權(quán)聲明:本文為CSDN博主「雨季莫憂離」的原創(chuàng)文章攘残,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明为狸。
原文鏈接:https://blog.csdn.net/u010937230/article/details/73303034

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末歼郭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辐棒,更是在濱河造成了極大的恐慌病曾,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漾根,死亡現(xiàn)場離奇詭異泰涂,居然都是意外死亡,警方通過查閱死者的電腦和手機辐怕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門逼蒙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寄疏,你說我怎么就攤上這事其做。” “怎么了赁还?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵妖泄,是天一觀的道長。 經(jīng)常有香客問我艘策,道長蹈胡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮罚渐,結(jié)果婚禮上却汉,老公的妹妹穿的比我還像新娘。我一直安慰自己荷并,他們只是感情好合砂,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著源织,像睡著了一般翩伪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谈息,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天缘屹,我揣著相機與錄音,去河邊找鬼侠仇。 笑死轻姿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的逻炊。 我是一名探鬼主播互亮,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼余素!你這毒婦竟也來了胳挎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤溺森,失蹤者是張志新(化名)和其女友劉穎慕爬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屏积,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡医窿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了炊林。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姥卢。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渣聚,靈堂內(nèi)的尸體忽然破棺而出独榴,到底是詐尸還是另有隱情,我是刑警寧澤奕枝,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布棺榔,位于F島的核電站,受9級特大地震影響隘道,放射性物質(zhì)發(fā)生泄漏症歇。R本人自食惡果不足惜郎笆,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忘晤。 院中可真熱鬧宛蚓,春花似錦、人聲如沸设塔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闰蛔。三九已至痕钢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钞护,已是汗流浹背盖喷。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工爆办, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留难咕,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓距辆,卻偏偏與公主長得像余佃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子跨算,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354