1. 程式人生 > >android,getExternalStorageDirectory()和getExternalFilesDir()的區別

android,getExternalStorageDirectory()和getExternalFilesDir()的區別

轉載地址:https://blog.csdn.net/nugongahou110/article/details/48154859

之前看到一位網友的吐槽:當我把手機連線到電腦上時,在SD卡根目錄看到了成百上千個各種應用程式建立的資料夾,拜託了各位開發者,你真的認為我的手機上只安裝你一個app嗎?你認為你的app是世界上最重要的app嗎?你應該將你的應用資料寫到這個路徑下!/Android/data/< package name >/files/…

作為一個開發者,我們的確不應該將我們應用的資料直接存到SD卡的根目錄下,當手機安裝了大量的app時,SD卡根目錄會迅速變得雜亂不堪。

這篇文章將帶大家區分一下什麼樣的資料應該存放到什麼樣的路徑下。

App專屬檔案 vs App獨立檔案
app專屬檔案就是那些只有該app才可以使用的檔案,例如專屬格式的電子書,app獨立檔案就是那些不依賴於某特定app的檔案,例如照片。

App獨立檔案
這類檔案當我們刪除應用之後,還應該保留在手機上的,例如拍照的照片,不應該隨著刪除應用而被刪除掉。對於這類檔案,Android給我們提供了特定的目錄,這些目錄都是以DIRECTORY開頭的,例如:DIRECTORY_MUSIC , DIRECTORY_PICTURES.

訪問這些資料夾有兩種方式:

第一種:
File sdCard = Environment.getExternalStorageDirectory();
1
這個sdCard的路徑為mnt/sdcard/ 即為SD卡根路徑,我們可以指定訪問的資料夾名

File sdCard = Environment.getExternalStorageDirectory();
File directory_pictures = new File(sdCard, "Pictures");
Log.i(TAG,"directory_pictures="+directory_pictures);

得到的路徑如下:

第二種:
File directory_pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
Log.e(TAG, "directory_pictures="+directory_pictures);

得到的路徑如下:

 

第二種方法是一個更加方便的訪問Android給我們提供好的一些公共目錄的方法,第一種方式更加靈活,可以自己指定目錄。

App專屬檔案
這類檔案應該是隨著app刪除而一起刪除的,它們可以被儲存在兩個地方:internal storage 和 external storage 。 internal storage就是手機自帶的一塊儲存區域,通常很小;external storage就是通常所說的SD卡,通常很大,有16GB,32GB等。

internal storage很小,所以你就應該很正確的使用它,因為SD卡有可能會被使用者卸下,換成新的,所以SD卡不是任何時間都可用的,因此我們必須將一些重要的資料庫檔案以及一些使用者配置檔案存放在internal storage中。將一些大的圖片或檔案等快取放到external storage中。

儲存在internal storage
這是你app私有的目錄,你的shared preference檔案,資料庫檔案,都儲存在這裡。目錄為data/data/< package name >/files/
訪問方法為:

File filesDir = getFilesDir();
Log.i(TAG,"file_dir="+filesDir);

 

儲存在external storage
這類檔案不應該存在SD卡的根目錄下,而應該存在mnt/sdcard/Android/data/< package name >/files/…這個目錄下。這類檔案應該隨著App的刪除而一起刪除。例如一種格式的電子書,只有該app才可以開啟,如果使用者刪除了該app,那麼留下來的電子書就成為了一種無法開啟的垃圾檔案,所以應該隨著該app一起刪除掉。

獲得這個路徑的方法:

File externalFilesDir = getExternalFilesDir(null);
Log.i(TAG, "externalFileDir = "+externalFilesDir);

我們看一下log中的內容為null,這是由於我們沒有新增許可權

 

新增許可權:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

再看一下log:

這樣路徑就訪問到了,我們注意到上面的getExternalFilesDir(null)引數傳入的為null,這樣預設訪問的是files資料夾,我們可以指定子資料夾

File externalFilesDir = getExternalFilesDir("Caches");
Log.i(TAG, "externalFileDir = "+externalFilesDir);

 

有些時候我們的手機沒有安裝SD卡,所以我們使用前需要判斷一下:

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//SD卡已裝入
}