更多分享:http://www.cherylgood.cn
android開發(fā)中本地存儲數據主要有三種方式:
- 1、SharedPreferences 存儲的信息量相對較小的情況下推薦使用。該方式采用key/value的形式進行存儲,多見于保存配置信息之類的。
- 2、Saving Data in SQL Databases 數據存儲到數據庫中,Android中使用SQLite。
- 3、Saving File 數據保存在文件中,也是本次主要學習的內容
File 對象適合按照從開始到結束的順序不跳過地讀取或寫入大量數據。 例如,它適合于圖片文件或通過網絡交換的任何內容。
- 存儲分為內部存儲和外部存儲:Android設備都有兩個文件存儲區(qū)域.
摘錄自google:
所有 Android 設備都有兩個文件存儲區(qū)域:“內部”和“外部”存儲。這些名稱在 Android 早期產生,當時大多數設備都提供內置的非易失性內存(內部存儲),以及移動存儲介質,比如微型 SD 卡(外部存儲)。一些設備將永久性存儲空間劃分為“內部”和“外部”分區(qū),即便沒有移動存儲介質,也始終有兩個存儲空間,并且無論外部存儲設備是否可移動,API 的行為均一致。以下列表匯總了關于各個存儲空間的實際信息。
內部存儲:
- 始終可用。
- 只有你的應用可以訪問本應用存儲在內部存儲中的文件。
- 當應用程序被卸載時,屬于該應用的內部存儲中的文件也會被移除。
外部存儲:
非實時可用,假如外部存儲為移動存儲介質時,受用戶的掛載影響。
外部存儲的數據是公開的,其他應用也可以讀取。
當應用被卸載時,由該應用在外部存儲中創(chuàng)建的文件不會自動被移除,需用戶自己操作移除,只有通過getExternalFilesDir() 方法獲取存儲目錄進行文件操作時,系統(tǒng)才會將該目錄與你的應用聯(lián)系起來,在應用卸載時,將文件一起移除。
注:在 Android N 之前,內部文件可以通過放寬文件系統(tǒng)權限讓其他應用訪問。而如今不再是這種情況。如果您希望讓其他應用訪問私有文件的內容,則您的應用可使用
外部存儲
-
1、在向外部存儲讀取文件前,先要申請相關權限:寫權限是包含了讀權限的
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAG E" />
...
</manifest> 2、在向外部存儲讀寫文件前,我們應該線檢測外部存儲是否可用:
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
通過使用Environment.getExternalStorageState()方法判斷外部存儲是否可用
-
getExternalStoragePublicDirectory 獲取外部公共存儲目錄調用時傳遞參數Environment.DIRECTORY_PICTURES 或者Environment.DIRECTORY_MUSIC來確定獲取的事pictures目錄還是music目錄,同時傳遞文件名進行文件的創(chuàng)建或者讀取,應用卸載時,不移除創(chuàng)建的文件。
File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), fileName); -
getExternalFilesDir() 如果你希望應用卸載時自動移除外部存儲創(chuàng)建的文件,可以調用getExternalFilesDir()方法,第一個參數為null時,直接獲取外部存儲根目錄
public File getAlbumStorageDir( Context context, String albumName) { // Get the directory for the app's private pictures directory. File file = new File(context.getExternalFilesDir( Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; }
內部存儲
在向內部存儲中讀取文件時則不需要額外申請權限。
- 在內部存儲中操作文件時,你可以通過getFileDir()方法(返回file表示你應用內部根目錄/data/data/xxx.xxx.xxx/)或者getCacheDir()(返回表示你的應用臨時緩存文件的內部目錄的 File。 )
注:在使用getCachDir()時,需要及時刪除所有不再需要的文件并在指定時間對使用的內存量實現(xiàn)合理大小限制,比如,1MB。 如果系統(tǒng)即將耗盡存儲,它會在不進行警告的情況下刪除該目錄下的文件。
獲取示例:
File file = new File(context.getFilesDir(), filename);
之后還要調用file.mkdirs()哦
也可以調用 openFileOutput()獲取寫入到內部目錄中的文件的 FileOutputStream。
示例:
String filename = "myfile";String string = "Hello world!";
FileOutputStream outputStream;try {
outputStream = openFileOutput(filename,Context.MODE_PRIVATE);
outputStream.write(string.getBytes());
outputStream.close();
} catch (Exception e) {
e.printStackTrace();}
對文件進行緩存:
public File 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;
}