前言:
選擇內部存儲還是外部存儲:
內部存儲:
- 始終存在可用;
- 保存的文件默認只能被保存文件的app訪問,各個應用之間不可以彼此訪問,只能訪問自己保存的文件。
- 當應用被卸載的時候應用保存的文件會被完全清除掉;
- 如果你想要保存的文件很安全,不會被用戶和其他應用讀取到,那么你可以選擇內部存儲這種方式。
外部存儲:
- 不一定存在,比如有的手機出廠是只有內部存儲,沒有外部存儲,用戶自己又沒有安裝micro-SD卡,這時外部存儲是不可用的;
- 讀寫完全開放的,所以你保存的數據可能會被用戶和可其它程序讀取;
- 卸載應用時只會刪除通過getExternalFilesDir()獲取到的目錄文件;
- 如果你的文件沒有必要控制訪問權限,可以允許其它應用或者用戶查看,那么外部存儲是不錯的選擇;
注:在默認情況下應用程序安裝到內部存儲,您可以指定android:installLocation屬性在AndroidManifest.xml文件中,這樣你的應用程序可以安裝在外部存儲器。對於用戶來說有這個安裝選項非常實用,當一些應用程序非常大,內部存儲空間不足的時候用戶可以把應用安裝到外部存儲空間。
獲取外部存儲權限:
<manifest ...>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
...
</manifest>
注意:現在所有的應用程序默認都有外部存儲的讀取權限,你不需要在AndroidManifest.xml文件中進行聲明,但是這種默認的權限可能會在以后的Android版本中變更,所以最好還是要在AndroidManifest中顯式的進行讀取權限聲明,免得在以后的版本中程序出現問題,讀取權限聲明如下:
<manifest ...>
<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
...
</manifest>
保存到內部存儲:
1、File getFilesDir ();
返回一個文件目錄,這個目錄下保存應用程序的數據,通過 openFileOutput(String, int) 創建的文件都保存在這個文件目錄下。這個目錄大概是:data/data/包名/files,比如豌豆莢應用程序是:data/data/com.wandoujia.phoenix2/files/
返回一個文件目錄,這個目錄存放的是應用程序緩存文件,當系統空間不足時這部分文件首先會被刪除。這個目錄大概是:data/data/包名/cache,比如豌豆莢應用程序是:data/data/com.wandoujia.phoenix2/cache/注意:緩存文件的刪除不應該依賴系統去刪除它,最好的辦法是給你的應用緩存設置一個最大值,比如1M,當達到這個值時你應該去刪除部分緩存文件以便能再次利用這部分空間。
當你想要在內部存儲寫入一個文件時,首先要創建一個文件,可以通過File的構造器,傳入上面兩個方法獲取的路徑作為參數,很方便的就能創建一個文件,例如:
File file = newFile(context.getFilesDir(), filename);
然后再通過上面的file創建文件流,寫入文件,當然你可能更喜歡下面的方式,通過調用 openFileOutput() 創建一個FileOutputStream ,然后寫入文件,代碼如下:
String filename ="myfile";
Stringstring="Hello world!";
FileOutputStream outputStream;
try{
outputStream = openFileOutput(filename,Context.MODE_PRIVATE);
outputStream.write(string.getBytes());
outputStream.close();
}catch(Exception e){
e.printStackTrace();
}
當你需要創建一個緩存文件時,你可以通過下面的方式:
File file = newFile(context.getCacheDir(), filename);
或者,你會更喜歡下面的方式,通過File的creatTempFile方法在cache目錄創建臨時文件,文件的后綴是.tmp:
publicFile getTempFile(Context context,String url){
File file;
try{
String fileName =Uri.parse(url).getLastPathSegment();
file =File.createTempFile(fileName,null, context.getCacheDir());
catch(IOException e){
// Error while creating file
}
return file;
}
注意:通常情況下你的應用程序內部存儲文件是不會被其他應用程序訪問到的,因為其他程序的訪問首先需要知道你應用的包名和文件名,其次需要獲取到你這個文件的訪問權限。從技術上來說如果你存放的文件開放了文件讀取權限其他應用程序就能讀取到,除非是你把文件設置為可讀寫的,要不然其他程序是無法讀取你的文件的,所以文件權限Context.MODE_PRIVATE是必須要設置的。
保存到外部存儲:
/* Checks if external storage is available for read and write */
publicboolean isExternalStorageWritable(){
String state =Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state)){
returntrue;
}
returnfalse;
}
/* Checks if external storage is available to at least read */
publicboolean isExternalStorageReadable(){
String state =Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state)||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){
returntrue;
}
returnfalse;
}
public files:
private files:
大家最常見的DIRECTORY_PICTURES目錄是:/mnt/sdcard/Pictures,比如你想要存儲一張圖片,要在外部存放圖片的公共目錄創建一個圖片文件:
publicFile getAlbumStorageDir(String albumName){
// Get the directory for the user's public pictures directory.
File file =newFile(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), albumName);
if(!file.mkdirs()){
Log.e(LOG_TAG,"Directory not created");
}
return file;
}
如果你想要保存私有類型的數據到外部存儲上,可以通過調用Context.java中的:
/mnt/sdcard/Android/data/data/your_package/type ,type同上,根據你想要保存的文件類型選擇,下面是創建存放私有圖片文件的例子:
publicFile getAlbumStorageDir(Context context,String albumName){
// Get the directory for the app's private pictures directory.
File file =newFile(context.getExternalFilesDir(
Environment.DIRECTORY_PICTURES), albumName);
if(!file.mkdirs()){
Log.e(LOG_TAG,"Directory not created");
}
return file;
}
如果type中沒有你需要的類型,你可以輸入null,此時返回的是你的應用程序外部存儲目錄的私有目錄的根目錄。
查詢剩余空間:
刪除文件:
總結:
大家如果對編程感興趣,想了解更多的編程知識,解決編程問題,想要系統學習某一種開發知識,我們這里有java高手,C++/C高 手,windows/Linux高手,android/ios高手,請大家關注我的微信公眾號:程序員互動聯盟or coder_online,大牛在線為您提供服務。

