天天看點

Android内、外存儲分區&常用存儲目錄,getExternalStorageDirectory擷取的是storage/emulated/0/

目錄

​​getExternalStorageDirectory擷取的是storage/emulated/0/​​

​​通過Environment擷取的路徑​​

​​存儲的”内“和“外”​​

​​應用程式cache目錄​​

​​storage/emulated/0 是存儲在什麼地方?​​

​​android讀取sdcard路徑下的檔案的方法​​

​​Android 在外部存儲中建立檔案夾​​

getExternalStorageDirectory擷取的是storage/emulated/0/

你在debug 的時候通過getExternalStorageDirectory擷取的是storage/emulated/0/原因是由于你的檔案讀取權限沒有

通過Environment擷取的路徑

Environment.getDataDirectory().getPath() :                                   獲得根目錄/data 内部存儲路徑

Environment.getDownloadCacheDirectory().getPath()  :               獲得緩存目錄/cache

Environment.getExternalStorageDirectory().getPath():                  獲得SD卡目錄/mnt/sdcard(擷取的是手機外置sd卡的路徑)

Environment.getRootDirectory().getPath() :                                   獲得系統目錄/system

通過Context擷取的路徑

Context.getDatabasePath()                                                      傳回通過Context.openOrCreateDatabase 建立的資料庫檔案

Context.getCacheDir().getPath() :                                            用于擷取APP的cache目錄 /data/data//cache目錄

Context.getExternalCacheDir().getPath()  :                             用于擷取APP的在SD卡中的cache目錄/mnt/sdcard/Android/data//cache

Context.getFilesDir().getPath()  :                                             用于擷取APP的files目錄 /data/data//files

Context.getObbDir().getPath():                                                用于擷取APPSDK中的obb目錄 /mnt/sdcard/Android/obb/

Context.getPackageName() :                                                  用于擷取APP的所在包目錄

Context.getPackageCodePath()  :                                          來獲得目前應用程式對應的 apk 檔案的路徑

Context.getPackageResourcePath() :                                    擷取該程式的安裝包路徑

存儲的”内“和“外”

所有Android裝置都有兩個檔案存儲區域:内部存儲空間(internal Storage)和外部存儲空間(external Storage)。

是以,Android系統從邏輯上,隻分為"internal Storage" 與 “external Storage” 兩個存儲分區。

内部存儲分區(internal Storage)

内部存儲分區,實體位置主要包括了Android系統根目錄下的/data、/System、/cache等目錄。

内部存儲分區的特點:内部分區總是可用。它存放App私有檔案,并且不可被其他App通路。

App解除安裝後,存儲在内部分區上的該App資料将會被清除。不需要額外申請權限。

外部存儲分區(external Storage):手機檔案管理器能夠看到的檔案,包括sd卡

它有以下幾個特點:外部分區并不總是可用。儲存在這裡的檔案可能被其他程式通路。

當使用者解除安裝app時,系統僅僅會删除external中的緩存目錄(Context.getExternalCacheDir())和file目錄(Context.getExternalFilesDir())下的相關檔案。需要申請WRITE_EXTERNAL_STORAGE或READ_EXTERNAL_STORAGE權限。

我們在開發過程中,經常需要讀取或者存儲一些資料,這些資料可以存儲在内部分區中,也可以存儲在外部分區中,但不同的操作方式會有很大差別,我們下面來詳細進行分析。

子目錄

/system/app:存放rom本身附帶的軟體即系統軟體。

/system/data:存放/system/app中,核心系統軟體的資料檔案資訊。

/system/priv-app:存放手機廠商定制的系統級别的應用的apk檔案。

/system/bin:存放系統的本地程式,裡面主要是Linux系統自帶的元件。

/system/media:存放一些音效、鈴聲、開關機動畫等。

/data目錄

/data目錄時我們App私有資料存儲的頂級目錄,可以通過Environment.getDataDirectory()擷取。

Environment.getDataDirectory()源碼:

private static final File DIR_ANDROID_DATA = getDirectory(ENV_ANDROID_DATA, "/data");
    /**
     * Return the user data directory.
     */
    public static File getDataDirectory(){
        return      

應用程式cache目錄

cache目錄是我們App内部存儲的緩存目錄。它可以通過Context對象的getCacheDir()方法來獲得,位置是通常是:/data/data/<app包名>/cache檔案夾。如果您想暫時保留而非永久存儲某些資料,則應使用特殊的緩存目錄來儲存這些資料。不應依賴系統為您清理這些檔案,而應始終自行維護緩存檔案,使其占用的空間保持在合理的限制範圍内(例如 1MB)。當使用者解除安裝您的應用時,這些檔案也會随之移除。

getCacheDir()方法

Context對象的getCacheDir()方法可以擷取cache目錄。

ContextImpl中的源碼:

@Override

public File getCacheDir() {

synchronized (mSync) {

if (mCacheDir == null) {

mCacheDir = new File(getDataDir(), "cache");

}

return ensurePrivateCacheDirExists(mCacheDir, XATTR_INODE_CACHE);

}

}      

cache檔案有以下幾個特點需要注意:

系統将在磁盤空間不足時自動删除此目錄中的檔案。

系統将始終首先删除舊檔案。

我們可以使用StorageManager類的相關方法更好的管理我們的删除規則。

App所占緩存空間的大小可以通過StorageManager.getCacheQuotaBytes(java.util.UUID)來獲得。

超過App所配置設定限額的緩存空間将被優先删除,我們應該盡可能的使我們的cache空間内的檔案低于限額值,這會使得我們的cache檔案最大可能的減少被删除的機率。

databases目錄

databases目錄存放了應用程式的資料庫檔案,位置是通常是:/data/data/<app包名>/databases檔案夾。

Android内、外存儲分區&amp;常用存儲目錄,getExternalStorageDirectory擷取的是storage/emulated/0/

外部存儲分區的通路

外部存儲可能是不可用的,比如遇到SD卡被拔出等情況時,是以在通路之前應對其可用性進行檢查。我們可以通過執行getExternalStorageState()來查詢外部儲存設備的狀态,若傳回狀态為MEDIA_MOUNTED, 則可以讀寫。

/sdcard

外部存儲的sd卡根目錄,也就是我們平時從檔案管理器中能看到的最頂級目錄,它的File絕對路徑為:/storage/emulated/0。

通路方式

可以通過Environment類的getExternalStorageDirectory方法通路:

storage/emulated/0 是存儲在什麼地方?

Android内、外存儲分區&amp;常用存儲目錄,getExternalStorageDirectory擷取的是storage/emulated/0/

​編輯

是一個檔案。storage/emulated/0/其實是你的SD卡路徑,裡面的内容也就是卡上的内容,該路徑隻是個挂載點 。應該在手機的download檔案裡面。

它是 “模拟SD卡”(不是真實的SD卡) 這一事實。

這是引用路徑,别擔心。打開ddmsFileExplorer,可以在你的mnt/sdcard後面看到一列info,列裡面寫的就是類似于/storage/emulated/0/這個東西,然後可以在你的FileExplorer中找storage檔案夾,下面就會有emulated,然後下面會有0,其實都是一樣的。

android讀取sdcard路徑下的檔案的方法

直接寫檔案目錄 mnt/sdcard/

Android 在外部存儲中建立檔案夾

File(video_savePath);
    if (!file.exists()) {
      // 建立檔案

      file.createNewFile();