日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android内部存储与外部存储解析

發(fā)布時間:2023/12/31 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android内部存储与外部存储解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Android開發(fā)的過程中。經(jīng)常會涉及到存儲,之前一直沒有一個整體的概念,這篇文章就是進(jìn)行一個知識點(diǎn)的梳理。

Android的存儲有:內(nèi)部存儲、外部存儲。

想要了解這兩個概念,我們先將開發(fā)軟件中的DDMS打開,看File Explorer,如下:

1、內(nèi)部存儲

上邊的data文件夾,就是內(nèi)部存儲。data文件夾中有兩個重要的文件夾app、data。
  app文件夾存放著我們所有已安裝的軟件的apk文件。
  data文件夾存放以包名命名的文件夾。每個文件夾里是:
    /data/data/包名/shared_prefs
    /data/data/包名/databases
    /data/data/包名/files
    /data/data/包名/cache
  這四個文件夾,其中SharePreferenced的數(shù)據(jù)就是存在shared_prefs中。軟件中的數(shù)據(jù)庫文件就是存在databases中,普通文件存在files中,緩存存在cache中。

在內(nèi)部存儲中的數(shù)據(jù),當(dāng)相關(guān)的軟件刪除時,會被同時刪除。

2、外部存儲

圖中的mnt文件夾就是外部存儲,不同的手機(jī)生產(chǎn)廠商對應(yīng)的文件夾還可能是storage文件夾。在storage文件夾中還有一個文件夾sdcard。這個就是我們平時調(diào)用獲取外部存儲api時獲取文件夾。在這個文件夾中公有目錄和私有目錄。公有目錄有九大類。私有目錄只有Android這一個,里邊也是以包名為目錄的。

  在很多文章中說,內(nèi)部存儲就是手機(jī)自帶的內(nèi)存、手機(jī)出廠時已經(jīng)有的內(nèi)存。外部存儲就是通過擴(kuò)展SD卡的功能后增加的存儲卡,這種是不正確的。
  早期的Android設(shè)備,的確內(nèi)部存儲時自帶的、固定的。但是后來的手機(jī)將自身的存儲擴(kuò)展到了8G以及更高,許多手機(jī)也不再提供擴(kuò)展SD卡功能。這時就只是在概念上把手機(jī)的存儲劃出了內(nèi)部存儲和外部存儲。所以不管有沒有SD卡,都有內(nèi)部存儲和外部存儲。但是不管什么情況,訪問內(nèi)部存儲和外部存儲都用的同一套Android Api。

在外部存儲中的數(shù)據(jù),當(dāng)卸載軟件時,該軟件存在私有目錄/data/storage/Android/data/包名/ 下的數(shù)據(jù)將全部刪掉。軟件存在公有目錄下的數(shù)據(jù)不會被刪掉。

3、存儲空間的操作

操作內(nèi)部存儲空間和外部存儲空間的私有目錄時,以context獲取的。操作外部存儲空間時,以Environmnet獲取。方法總結(jié)如下:

內(nèi)部存儲

目錄方法
/data/data/包名/filescontext.getFilesDir()
/data/data/包名/cachecontext.getCacheDir()


外部存儲

目錄方法
根目錄Environment.getExternalStorageDirectory()
公有目錄(九大公有目錄)Environment.getExternalStoragePublicDirectory(String type)
私有目錄
/data/storage/Android/data/包名/files
context.getExternalFilesDir(String type)
私有目錄
/data/storage/Android/data/包名/cache
context.getExternalCacheDir()


其中,公有目錄的type類型,我們查看源碼:

/*** Get a top-level shared/external storage directory for placing files of a* particular type. This is where the user will typically place and manage* their own files, so you should be careful about what you put here to* ensure you don't erase their files or get in the way of their own* organization.* <p>* On devices with multiple users (as described by {@link UserManager}),* each user has their own isolated shared storage. Applications only have* access to the shared storage for the user they're running as.* </p>* <p>* Here is an example of typical code to manipulate a picture on the public* shared storage:* </p>* {@sample development/samples/ApiDemos/src/com/example/android/apis/content/ExternalStorage.java* public_picture}** @param type The type of storage directory to return. Should be one of* {@link #DIRECTORY_MUSIC}, {@link #DIRECTORY_PODCASTS},* {@link #DIRECTORY_RINGTONES}, {@link #DIRECTORY_ALARMS},* {@link #DIRECTORY_NOTIFICATIONS}, {@link #DIRECTORY_PICTURES},* {@link #DIRECTORY_MOVIES}, {@link #DIRECTORY_DOWNLOADS},* {@link #DIRECTORY_DCIM}, or {@link #DIRECTORY_DOCUMENTS}. May not be null.* @return Returns the File path for the directory. Note that this directory* may not yet exist, so you must make sure it exists before using* it such as with {@link File#mkdirs File.mkdirs()}.*/public static File getExternalStoragePublicDirectory(String type) {throwIfUserRequired(); return sCurrentUser.buildExternalStoragePublicDirs(type)[0];}

可以看出九種類型是:

類型意義
Environment.DIRECTORY_MUSIC音樂保存的位置
Environment.DIRECTORY_PODCASTS用于保存podcast(博客)的音頻文件
Environment.DIRECTORY_RINGTONES保存鈴聲的位置
Environment.DIRECTORY_ALARMS警報(bào)的鈴聲
Environment.DIRECTORY_NOTIFICATIONS通知音保存的位置
Environment.DIRECTORY_PICTURES下載的圖片保存的位置
Environment.DIRECTORY_MOVIES電影保存的位置
Environment.DIRECTORY_DOWNLOADS下載文件保存的位置
Environment.DIRECTORY_DCIM相機(jī)拍攝的圖片和視頻保存的位置



其中,context.getExternalFilesDir(String type)的類型有7種,看主要源碼:

/*** @param type The type of files directory to return. May be {@code null}* for the root of the files directory or one of the following* constants for a subdirectory:* {@link android.os.Environment#DIRECTORY_MUSIC},* {@link android.os.Environment#DIRECTORY_PODCASTS},* {@link android.os.Environment#DIRECTORY_RINGTONES},* {@link android.os.Environment#DIRECTORY_ALARMS},* {@link android.os.Environment#DIRECTORY_NOTIFICATIONS},* {@link android.os.Environment#DIRECTORY_PICTURES}, or* {@link android.os.Environment#DIRECTORY_MOVIES}.* @return the absolute path to application-specific directory. May return* {@code null} if shared storage is not currently available.* @see #getFilesDir* @see #getExternalFilesDirs(String)* @see Environment#getExternalStorageState(File)* @see Environment#isExternalStorageEmulated(File)* @see Environment#isExternalStorageRemovable(File)*/@Nullablepublic abstract File getExternalFilesDir(@Nullable String type);

可以看出七種類型是:

類型意義
Environment.DIRECTORY_MUSIC音樂保存的位置
Environment.DIRECTORY_PODCASTS用于保存podcast(博客)的音頻文件
Environment.DIRECTORY_RINGTONES保存鈴聲的位置
Environment.DIRECTORY_ALARMS警報(bào)的鈴聲
Environment.DIRECTORY_NOTIFICATIONS通知音保存的位置
Environment.DIRECTORY_PICTURES下載的圖片保存的位置
Environment.DIRECTORY_MOVIES電影保存的位置

注意:這個方法是可以傳一個null的參數(shù)的,表示獲取的是當(dāng)前目錄。如果傳入類型,則獲取的是對應(yīng)的子目錄。



下邊給出一個對上邊講述方法進(jìn)行運(yùn)用的一個工具類:

import android.content.Context; import android.os.Environment;public class SDUtil {// 判斷SD卡是否被掛載public static boolean isSDCardMounted() {return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());}// 獲取內(nèi)部存儲文件的存儲路徑public static String getFilePath(Context context) {return context.getFilesDir().getPath();}// 獲取內(nèi)部存儲緩存的存儲路徑public static String getCachePath(Context context) {return context.getCacheDir().getPath();}// 獲取外部存儲根的存儲路徑,因?yàn)椴煌纳碳彝獠看鎯Φ慕^對路徑可能不同,所以用相對路徑進(jìn)行操作public static String getExternalPath() {if (isSDCardMounted()){return Environment.getExternalStorageDirectory().getAbsolutePath();}return null;}// 獲取外部存儲公共目錄的存儲路徑public static String getExternalPublicPath(String type) {if (isSDCardMounted()){return Environment.getExternalStoragePublicDirectory(type).getAbsolutePath();}return null;}// 獲取外部存儲私有目錄的文件的存儲路徑public static String getExternalFilePath(Context context,String type) {if (isSDCardMounted()){return context.getExternalFilesDir(type).getAbsolutePath();}return null;}// 獲取外部存儲私有目錄的緩存的存儲路徑public static String getExternalCachePath(Context context,String type){if (isSDCardMounted()){return context.getExternalCacheDir().getAbsolutePath();}return null;}}

這篇博客是一篇學(xué)習(xí)總結(jié),如有錯誤的地方,請大家指正。

總結(jié)

以上是生活随笔為你收集整理的Android内部存储与外部存储解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。