九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
徹底搞懂Android文件存儲(chǔ)

本文轉(zhuǎn)自--https://blog.csdn.net/u010937230/article/details/73303034-

作者CSDN博客用戶——雨季莫憂離

前言:

對(duì)于任何一個(gè)應(yīng)用來說,無論是PC端應(yīng)用還是Android應(yīng)用,存儲(chǔ)肯定是必不可少的。對(duì)于很多做Android開發(fā)的同學(xué)來說,可能認(rèn)為文件存儲(chǔ)很簡(jiǎn)單,調(diào)用一些諸如getFilesDir,getExternalStorageDirectory方法行了,但是雖然說它們會(huì)調(diào)用相應(yīng)的方法來實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)存儲(chǔ)。但是他們未必就搞懂了他的數(shù)據(jù)到底存在了哪里,以及他的數(shù)據(jù)是否存對(duì)了地方,或者是否做好了版本兼容。下面我將從這幾個(gè)地方來解答大家常見的困惑:
1、Android中內(nèi)部存儲(chǔ),外部存儲(chǔ)的概念
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,以及擴(kuò)展存儲(chǔ)(TF卡)的區(qū)別;內(nèi)部存儲(chǔ),外部存儲(chǔ)的區(qū)別。

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

內(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來獲取和操作。
訪問內(nèi)部存儲(chǔ)的API方法:
1、Environment.getDataDirectory()
2、getFilesDir().getAbsolutePath()
3、getCacheDir().getAbsolutePath()
4、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath()
外部存儲(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);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如果你的手機(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卡部分

二、不同Android版本下getDataDirectory,getFilesDir,getCacheDir,getDir,getExternalStorageDirectory,getExternalStoragePublicDirectory,getExternalFilesDir,getExternalCacheDir,getExternalCacheDir,getRootDirectory的區(qū)別和聯(lián)系

上面這些方法,我們可能似曾相識(shí),但是對(duì)于有些同學(xué)來說卻又很難分清出,主要還是不同的Android版本的問題。為了方便大家理解,我先簡(jiǎn)要介紹以上各個(gè)方法,為方便大家理解我把這些方法的結(jié)果打印出來(以下的打印結(jié)果是基于榮耀7的(系統(tǒng)版本6.0):
1、Environment.getDataDirectory() = /data
這個(gè)方法是獲取內(nèi)部存儲(chǔ)的根路徑
2、getFilesDir().getAbsolutePath() = /data/user/0/packname/files
這個(gè)方法是獲取某個(gè)應(yīng)用在內(nèi)部存儲(chǔ)中的files路徑
3、getCacheDir().getAbsolutePath() = /data/user/0/packname/cache
這個(gè)方法是獲取某個(gè)應(yīng)用在內(nèi)部存儲(chǔ)中的cache路徑
4、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath() = /data/user/0/packname/app_myFile
這個(gè)方法是獲取某個(gè)應(yīng)用在內(nèi)部存儲(chǔ)中的自定義路徑
方法2,3,4的路徑中都帶有包名,說明他們是屬于某個(gè)應(yīng)用
…………………………………………………………………………………………
5、Environment.getExternalStorageDirectory().getAbsolutePath() = /storage/emulated/0
這個(gè)方法是獲取外部存儲(chǔ)的根路徑
6、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath() = /storage/emulated/0
這個(gè)方法是獲取外部存儲(chǔ)的根路徑
7、getExternalFilesDir(“”).getAbsolutePath() = /storage/emulated/0/Android/data/packname/files
這個(gè)方法是獲取某個(gè)應(yīng)用在外部存儲(chǔ)中的files路徑
8、getExternalCacheDir().getAbsolutePath() = /storage/emulated/0/Android/data/packname/cache
這個(gè)方法是獲取某個(gè)應(yīng)用在外部存儲(chǔ)中的cache路徑
注意:其中方法7和方法8如果在4.4以前的系統(tǒng)中g(shù)etExternalFilesDir(“”)和getExternalCacheDir()將返回null,如果是4.4及以上的系統(tǒng)才會(huì)返回上面的結(jié)果,也即4.4以前的系統(tǒng)沒插SD卡的話,就沒有外部存儲(chǔ),它的SD卡就等于外部存儲(chǔ);而4.4及以后的系統(tǒng)外部存儲(chǔ)包括兩部分,getExternalFilesDir(“”)和getExternalCacheDir()獲取的是機(jī)身存儲(chǔ)的外部存儲(chǔ)部分,也即4.4及以后的系統(tǒng)你不插SD卡,它也有外部存儲(chǔ),既然getExternalFilesDir(“”)和getExternalCacheDir()獲取的是機(jī)身存儲(chǔ)的外部存儲(chǔ)部分,那么怎么獲取SD卡的存儲(chǔ)路徑呢,還是通過上面提到的getExternalFilesDirs(Environment.MEDIA_MOUNTED)方法來獲取了,不知道Android有沒有提供相關(guān)的API接口來獲取SD卡的存儲(chǔ)路徑,大家可以去查資料。又重復(fù)了上面的話,主要是提醒大家要注意不同的Android版本是有差別的,這個(gè)最坑了。
…………………………………………………………………………………………
Environment.getDownloadCacheDirectory() = /cache
Environment.getRootDirectory() = /system
這兩個(gè)方法沒什么說的了,每個(gè)版本的android系統(tǒng)都一樣
…………………………………………………………………………………………
從上面我們很清楚的可以看到上面的方法可以分為三類,我用橫線隔開了。第一類是位于根目錄/data下;還有一類是位于根目錄/storage下,可以看到調(diào)用它們的API方法都帶了一個(gè)External;另外一類不在/data下也不再/storage下,比如系統(tǒng)文件/system,或者緩存文件/cache。
/data目錄下的文件物理上存放在我們通常所說的內(nèi)部存儲(chǔ)里面
/storage目錄下的文件物理上存放在我們通常所說的外部存儲(chǔ)里面
/system用于存放系統(tǒng)文件,/cache用于存放一些緩存文件,物理上它們也是存放在內(nèi)部存儲(chǔ)里面的
下面來看一下大家常見的疑問
疑問1、那getFilesDir().getAbsolutePath()和getCacheDir().getAbsolutePath()有什么區(qū)別呢?
其實(shí)是沒有什么區(qū)別的,我們可以看下面一張圖:


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)建的。
疑問2、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、什么是APP專屬文件?
上面疑問2我們提到了專屬文件,所謂專屬文件就是它是屬于某個(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ì)留下很多垃圾文件。
疑問4、既然內(nèi)部存儲(chǔ)與外部存儲(chǔ)都有APP專屬文件,那么我們?cè)撌褂媚膫€(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;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

存儲(chǔ)位置 獲取路徑的方法 容量(寫入前) 容量(寫入后) 備注
/data/data/packname/files getFilesDir() 1.59GB 1.57GB 內(nèi)部存儲(chǔ)
/storage/sdcard0/Android
/data/packname/files
getExternal
StorageDirectory()
1.47GB 1.45GB 外部存儲(chǔ)(SD卡)

表二、4.1.1系統(tǒng),不帶有SD卡 (真機(jī))

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

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

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

表四、4.4.2系統(tǒng),帶有SD卡 (真機(jī))

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

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

存儲(chǔ)位置 獲取路徑的方法 容量(寫入前) 容量(寫入后) 備注
/data/data/packname/files getFilesDir() 2.22GB 2.18GB 內(nèi)部存儲(chǔ)
/storage/emulated/0/Android
/data/packname/files
getExternal
StorageDirectory()
2.20GB 2.16GB 機(jī)身外部存儲(chǔ)

表六、6.0.0系統(tǒng),帶有SD卡 (真機(jī))

存儲(chǔ)位置 獲取路徑的方法 容量(寫入前) 容量(寫入后) 備注
/data/user/0/packname/files getFilesDir() 11.94GB 11.90GB 內(nèi)部存儲(chǔ)
/storage/emulated/0/Android
/data/packname/files
getExternal
StorageDirectory()
11.92GB 11.88GB 機(jī)身外部存儲(chǔ)
/storage/B3E4-1711 getExternalFilesDirs 1.47GB 1.47GB 外部存儲(chǔ)(SD卡)
沒有向其寫數(shù)據(jù),只是讀取

表七、6.0.0系統(tǒng),不帶有SD卡 (真機(jī))

存儲(chǔ)位置 獲取路徑的方法 容量(寫入前) /storage/容量(寫入后) 備注
/data/user/0/packname/files getFilesDir() 11.93GB 11.89GB 內(nèi)部存儲(chǔ)
/storage/emulated/0/Android
/data/packname/files
getExternal
StorageDirectory()
11.91GB 11.87GB 機(jī)身外部存儲(chǔ)

注:上述容量指的是該路徑所在根路徑的可用容量,比如/data/data/packname/files的容量是指/data的可用容量,/storage/sdcard0/Android/data/packname/files指的是/storage/sdcard0的可用容量,而一般在4.4及以上的系統(tǒng)中,我們很少操作SD

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

這個(gè)很容易搞混,為什么呢?通過上面我們知道:
/data/user/0/packname/files它是用來存儲(chǔ)普通數(shù)據(jù)的
/data/user/0/packname/cache它是用來存儲(chǔ)緩存數(shù)據(jù)的
所以很多人就以為我清除數(shù)據(jù)時(shí)清除的肯定就是files下的數(shù)據(jù),而我清除緩存數(shù)據(jù)時(shí)清除的肯定就是cache下的數(shù)據(jù),但是事實(shí)卻不是這樣的。正確應(yīng)該是:
清除緩存:我們知道應(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ù)據(jù):清除數(shù)據(jù)才是真正的刪除了我們保存在文件中的數(shù)據(jù)(永久性數(shù)據(jù),如果不人為刪除的話會(huì)一直保存在文件中)例如當(dāng)我們?cè)谠O(shè)置里面清除了某個(gè)應(yīng)用的數(shù)據(jù),那么/data/user/0/packname/和/storage/emulated/0/Android/data/packname/下的文件里面的數(shù)據(jù)會(huì)全部刪除,包括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,因?yàn)?.2是模擬器打印的結(jié)果,如果是真機(jī)的話也是/storage/sdcard0;4.4的getExternalStorageDirectory方法獲取到的路徑為/storage/emulated/0,它的SD卡存儲(chǔ)路徑為/storage/sdcard1;6.0的getExternalStorageDirectory方法獲取到的路徑為/storage/emulated/0,它的SD卡存儲(chǔ)路徑為/storage/B3E4-1711;另外根據(jù)測(cè)試在4.0上getExternalStorageDirectory方法獲取到的路徑為/mnt/sdcard。所以在真機(jī)上,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)于掛載大家可以自行去百度。還有我們不明白為什么會(huì)有有/storage/sdcard,/sdcard,/mnt/sdcard,/storage/emulated/0這么多目錄,讓人看起來眼花繚亂,要詳細(xì)了解請(qǐng)仔細(xì)看下面的文章,下面的文章是我摘自關(guān)于android的4.2的0文件夾的詳解
—- android 4.0 —-
在galaxy nexus(GN)手機(jī)上userdata分區(qū)很大,被掛在/data目錄,用戶的數(shù)據(jù)通常是放在sd卡上,然而gn是沒有sd卡的,所以google想了一個(gè)辦法,就是虛擬一個(gè)。
所以,在userdata分區(qū)下有個(gè)目錄叫media,是內(nèi)置sd卡的數(shù)據(jù)存儲(chǔ)位置,使用fuse技術(shù)將/data/media虛擬成為一個(gè)叫做/dev/fuse的設(shè)備,為了讓程序能認(rèn)出來,被同時(shí)掛載在 /mnt/sdcard 目錄,又為了兼容以前的程序,做了一個(gè)快捷方式(linux系統(tǒng)里叫軟連接) /sdcard 指向的是 /mnt/sdcard .
當(dāng)然,這些都是4.0的做法。
—- android 4.1 —-
在4.1里,同樣也會(huì)使用fuse技術(shù),/dev/fuse 會(huì)被同時(shí)掛載到/storage/sdcard0 目錄,這個(gè)sdcard0表示第一個(gè)sd卡(如果有外置sd卡,那會(huì)多一個(gè) /storage/sdcard1,比如我的xoom), /sdcard 軟連接會(huì)指向 /storage/sdcard0 ,此時(shí)/mnt/sdcard 也是個(gè)軟連接,會(huì)指向/storage/sdcard0。
如果你通過otg線接U盤,會(huì)被掛載到 /storage/usb0目錄,stickmount這個(gè)軟件為了讓圖庫、快圖、mx player等軟件,能看到u盤里的數(shù)據(jù),又同時(shí)掛載到 /storage/sdcard0/usStorage/sda1.
也許你會(huì)問,為什么不是usb0,而是sda1,這是linux的對(duì)硬盤的命名方式,如果你的u盤有多個(gè)分區(qū),就分別是sda1,sda2這樣一直排下去了。
—- android 4.2 —-
好了,我們開始說4.2系統(tǒng)。
谷歌是不是沒事干啊,非要給android搞個(gè)多用戶,你想想啊,在中國,可能因?yàn)榻?jīng)濟(jì)問題,家里不是每人一個(gè)電腦,在美國,幾乎需要用電腦的人,都會(huì)自己有一臺(tái)或多臺(tái),一臺(tái)電腦多人用的情況少之又少,這就是為什么叫PC了,顧名思義,個(gè)人電腦。像手機(jī)和平板這些東西,更加私人化了,很少公用了吧,我想在中國也是如此吧。
當(dāng)然,谷歌也不完全是抽風(fēng),因?yàn)樗懈蟮膽?zhàn)略部署,而且平板也的確有多人用的可能。
所以谷歌搞出來一個(gè)多用戶,那每個(gè)人的應(yīng)用、數(shù)據(jù)、個(gè)性配置都要分開吧。 應(yīng)用和個(gè)性配置好弄,想想啊,通過權(quán)限控制,每人只能看自己的應(yīng)用就行了,桌面也可以用自己的。
那數(shù)據(jù)怎么辦????
好吧,調(diào)整用戶數(shù)據(jù)的掛載結(jié)構(gòu)。android 4.2,同樣也會(huì)使用fuse技術(shù)/dev/fuse 會(huì)被掛載到/storage/emulated/0 目錄,為什么是0呢,你還記得上邊的sdcard0吧,第一個(gè)的意思。(如果有第二個(gè),應(yīng)該就是/storage/emulated/1,我們的三兒子沒有外置sd卡,所以沒法驗(yàn)證)
為了兼容以前,同時(shí)掛載到 /storage/emulated/legacy (故名思議,傳統(tǒng)的),還建立三個(gè)軟連接 /storage/sdcard0 ,/sdcard,/mnt/sdcard ,都指向 /storage/emulated/legacy
很多同學(xué)可能不會(huì)認(rèn)真看上面,這里我就簡(jiǎn)單總結(jié)一下:
1、其中sdcard/、mnt/sdcard、storage/sdcard0、storage/emulated/0、storage/emulated/legacy都是同一個(gè)路徑的不同”指針“,指向的是同一個(gè)地方,只是不同Android版本的叫法不一樣。
2、如果大家想了解每個(gè)版本的外部存儲(chǔ)路徑,同學(xué)們可以通過獲取getExternalStorageDirectory方法的打印結(jié)果進(jìn)行對(duì)比

五、一張圖看懂Ram,Rom,以及擴(kuò)展存儲(chǔ)(TF卡)的區(qū)別;內(nèi)部存儲(chǔ),外部存儲(chǔ)的區(qū)別。


1、首先我們來弄清幾個(gè)概念,內(nèi)存,內(nèi)部存儲(chǔ),外部存儲(chǔ),機(jī)身存儲(chǔ)(內(nèi)置存儲(chǔ))。
1.1內(nèi)存;我們?cè)谟⑽闹蟹Q作memory,內(nèi)存是計(jì)算機(jī)中重要的部件之一,它是與CPU進(jìn)行溝通的橋梁。計(jì)算機(jī)中所有程序的運(yùn)行都是在內(nèi)存中進(jìn)行的,所以說它是用于計(jì)算機(jī)運(yùn)行時(shí)的,它不是用來存儲(chǔ)數(shù)據(jù)的。
1.2內(nèi)部存儲(chǔ),外部存儲(chǔ);內(nèi)部存儲(chǔ)我們稱為InternalStorage,外部我們稱為ExternalStorage,這兩個(gè)概念來自于早期的Android智能機(jī),4.4以前,內(nèi)置存儲(chǔ)就是內(nèi)部存儲(chǔ),外置SD卡就是外置存儲(chǔ)。我們通過getDataDirectory就可以獲取內(nèi)置存儲(chǔ)根路徑,通過getExternalStorageDirectory就可以獲取外置SD卡根路徑。4.4以后外部存儲(chǔ)就包含兩部分了,其中通過getExternalStorageDirectory獲取的是機(jī)身存儲(chǔ)的外部存儲(chǔ),而外置SD卡我們則需要通過getExternalDirs遍歷來獲取了。
1.3機(jī)身存儲(chǔ);機(jī)身存儲(chǔ)是指手機(jī)自身攜帶的存儲(chǔ)空間,出廠時(shí)就已經(jīng)有了,4.4以前機(jī)身存儲(chǔ)就是內(nèi)部存儲(chǔ),4.4及以后機(jī)身存儲(chǔ)包含了內(nèi)部存儲(chǔ)和外部存儲(chǔ)。
2、Ram,Rom,以及擴(kuò)展存儲(chǔ)(TF卡)的概念。從圖中我們可以看到,一個(gè)手機(jī)里面有內(nèi)存,手機(jī)內(nèi)置存儲(chǔ),以及SD卡, 它們分別是Ram,Rom,以及TF卡,這三種卡的性能,材質(zhì)及價(jià)格都不一樣,都有各自的用處。
3、內(nèi)部存儲(chǔ),外部存儲(chǔ)的概念。很多人對(duì)這個(gè)存在誤解,認(rèn)為機(jī)身存儲(chǔ)就是內(nèi)存,而SD卡才叫外部存儲(chǔ),這其實(shí)是不對(duì)的,不同的Android版本是有差別的,請(qǐng)看第1條。
最后附上我的例子:
http://download.csdn.net/download/u010937230/9930396

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android內(nèi)、外存儲(chǔ) 易混淆點(diǎn)剖析(/mnt/sdcard、/storage/sdcard0、/storage/emulated/0等區(qū)別)
Android應(yīng)用正確使用擴(kuò)展SD卡
如何區(qū)分手機(jī)內(nèi)置存儲(chǔ)卡與外置存儲(chǔ)卡
android的Environment類
一篇文章搞懂a(chǎn)ndroid存儲(chǔ)目錄結(jié)構(gòu)
android4.0外置sd卡寫的權(quán)限
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服