轉載地址: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卡已裝入
}