目錄
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檔案夾。
外部存儲分區的通路
外部存儲可能是不可用的,比如遇到SD卡被拔出等情況時,是以在通路之前應對其可用性進行檢查。我們可以通過執行getExternalStorageState()來查詢外部儲存設備的狀态,若傳回狀态為MEDIA_MOUNTED, 則可以讀寫。
/sdcard
外部存儲的sd卡根目錄,也就是我們平時從檔案管理器中能看到的最頂級目錄,它的File絕對路徑為:/storage/emulated/0。
通路方式
可以通過Environment類的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();