對於Android
系統中的存儲,通常分爲如下三個方面:android
SD
卡存儲內部存儲指的是下面這個路徑下的文件夾或者文件:數據庫
/data/data/應用包名/
複製代碼
截圖以下: 緩存
Root Explorer
等工具才能夠看到,而且要申請Root
權限才能進行讀寫操做。Android
提供了一些方法來操做內部存儲的路徑,咱們能夠選擇它做爲咱們提供的標準目錄,也能夠本身建立目錄,下面咱們開始介紹。bash
/data/data/應用包名/files
files
目錄下建立、讀寫文件,能夠用下面這一對方法public static void writeToPrivateFile(Context context, String str, String path) {
FileOutputStream fileOutputStream = null;
BufferedWriter bufferedWriter;
try {
fileOutputStream = context.openFileOutput(path, Context.MODE_APPEND);
bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
bufferedWriter.write(str);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static String readFromPrivateFile(Context context, String path) {
FileInputStream fileInputStream = null;
BufferedReader bufferedReader;
String result = null;
try {
fileInputStream = context.openFileInput(path);
bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
String line;
while ((line = bufferedReader.readLine()) != null) {
result += line;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fileInputStream != null) {
fileInputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return result != null ? result : "";
}
複製代碼
files
目錄下建立新的目錄 上面的方法是直接打開輸入輸出流,讀寫位於files
根目錄下的文件,若是咱們但願進行更靈活的操做,那麼經過下面方法能夠得到files
文件夾所指向的File
對象,再經過這個返回的File
對象操做:File file = context.getFilesDir();
複製代碼
files
目錄下的全部文件名String[] files = context.fileList();
複製代碼
files
目錄下的文件context.deleteFile(path);
複製代碼
data/data/應用包名/cache
和files
目錄相比,cache
目錄有一個特色:就是當系統存儲空間不足時,會刪除其中的文件夾:app
File cacheFile = context.getCacheDir();
複製代碼
data/data/應用/code_cache
它和上面cache
目錄相似,都是隻能獲得一個File
對象,一樣的,它也有一個特色,就是當App
升級時,會刪除該目錄下的內容,這個API
要求大於21
:工具
File code = context.getCodeCacheDir()
複製代碼
SharePreference
和數據庫保存的目錄在平時的開發中,咱們常常會用到SharePreference
來保存數據,這些數據就位於:/data/data/應用包名/shared_prefs
目錄下,而數據庫則保存在/data/data/應用包名/databases
下。ui
除了使用上面四種根目錄以外,咱們還能夠直接在data/data/應用包名
目錄下新建目錄,調用下面的方法會咱們在/data/data/應用包名/
目錄下新建一個名字爲app_<path>
的文件夾,並返回這個文件夾的File
對象,以後,咱們再經過這個對象進行相應的操做:spa
File dir = context.getDir(path, Context.MODE_APPEND);
複製代碼
這裏指的外部存儲是咱們平時常說的32g/64g
,它是手機出廠時自帶的,不須要再額外的插入SD
卡,它主要解決上面內部存儲的兩個問題:3d
也就是下面截圖中部分的存儲: code
這部分存儲的特色是:
因爲這部分的存儲和應用無關,所以它的方法都不是經過Context
來調用,而是經過Environment
的靜態方法來返回一個File
對象,咱們再經過這個File
對象進行操做。
getRootDirectory
返回是/system
目錄,它和/sdcard
以及/data
是同級的.getExternalStorageDirectory
返回的是外部存儲的根目錄,也就是咱們平時從文件管理器中能看到的最頂級目錄,它的File
絕對路徑爲:/storage/emulated/0
getDownloadCacheDirectory
返回是/cache
目錄,它和/system
以及/data
是同級的.getExternalStoragePublicDirectory(String type)
其中,type
的選項有以下幾種:
DIRECTORY_DCIM
獲得的就是下面這個目錄:
這部分存儲的特色是:
4.4
之後不須要申請讀寫權限也能訪問這部分存儲的位置位於/Android/data/應用包名/
下,例以下面這樣,就是com.android.browser
的應用相關外部存儲:
getExternalCacheDir()
返回的是/Android/data/應用包名/cache
目錄所對應的File
對象getExternalFilesDir(String type)
type
和Environment
中定義的類型相同,根據type
的不一樣返回不一樣的File
對象,例如DIRECTORY_DCIM
,那麼獲得的是/Android/data/應用包名/files/DCIM
所對應的File
對象。