Android中的資料儲存一(檔案儲存、SharedPreferences儲存)
一.檔案儲存
檔案儲存不對儲存的內容進行處理,適合用於儲存一些簡單的文字資料或二進位制資料。如果要儲存較為複雜的文字資料,就要定義一套自己的格式規範。
1.將資料儲存到檔案中
Context類中有一個 openFileOutput(String name, int mode) 的方法,是用於將資料儲存到指定的檔案中,它的返回值為 FileOutputStream,其中有兩個引數,前者表示檔名稱(其中不能包含路徑名,其路徑都是在/data/data/包名/files/目錄下),後者表示操作模式,有MODE_PRIVATE(預設模式,檔案存在時覆蓋其中的內容)和MODE_APPEND(檔案存在,就往檔案的末尾新增資料
// 將message資訊寫入到name為名的檔案中 public void writeToFile(String name, String message) { FileOutputStream fileOutputStream = null; BufferedWriter bufferedWriter = null; try { fileOutputStream = openFileOutput(name, Context.MODE_PRIVATE); bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream)); bufferedWriter.write(message); } catch (IOException e) { e.printStackTrace(); } finally { try { if (bufferedWriter != null) { bufferedWriter.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (fileOutputStream != null) { fileOutputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } } public static final String name = "file"; public static final String message = "message"; // 呼叫方法 writeToFile(name, message);
可以通過 Device File Explorer 工具檢視是否生成了對應的檔案。
2.將資料從檔案中讀取出來
使用Context類中的 openFileInput(String name) 方法,它的返回值為 FileInputStream,其中的引數表示檔名(其路徑都是在/data/data/包名/files/目錄下)。得到了 FileInputStream 物件後就通過Java流將資料從檔案中讀取出來。具體的實現如下:
// 從name檔案中讀取資料 public String readFromFile(String name) { FileInputStream fileInputStream = null; BufferedReader bufferedReader = null; StringBuilder stringBuilder = new StringBuilder(); try { fileInputStream = openFileInput(name); bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)); String line = ""; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (bufferedReader != null) { bufferedReader.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (fileInputStream != null) { fileInputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } return stringBuilder.toString(); } public static final String name = "file"; // 呼叫方法 String message = readFromFile(name); // 最後通過適當的方式處理message,這裡就用log列印了一下 Log.d("MainActivity", message);
二.SharedPreferences儲存(以下簡稱SP)
SP是用鍵值對的方式儲存資料的。儲存時要給資料提供鍵,讀取時也要使用對應的鍵。
1.將資料儲存到SP中
要使用SP儲存資料,要先獲取SP的物件,主要有3種方法得到SP物件:Context類的 getSharedPreferences(String name, int mode) , Activity類的 getPreferences(int mode),PreferenceManager類的靜態方法 getDefaultSharedPreferences(Context context)。
1.1 三種方式的介紹
1.1.1 Context類的 getSharedPreferences(String name, int mode)
第一個引數是SP的名稱(其路徑都是在/data/data/包名/shared_prefs/目錄下),第二個引數是操作模式,其中只有一種模式即 MODE_PRIVATE(預設操作模式,表明只有當前應用可以讀寫這個SP檔案)。
1.1.2 Activity類的 getPreferences(int mode)
該方法實際是呼叫了Context類的 getSharedPreferences(String name, int mode) ,其中的name引數被設定為 getLocalClassName() ,表示的是以當前活動的類名作為SP的名稱。
1.1.3 PreferenceManager類的靜態方法 getDefaultSharedPreferences(Context context) ,該方法返回 context.getSharedPreferences(getDefaultSharedPreferencesName(context), getDefaultSharedPreferencesMode());
其中 getDefaultSharedPreferencesName(context) 返回context.getPackageName() + "_preferences" , getDefaultSharedPreferencesMode() 返回 MODE_PRIVATE 。也就是說明最後是以當前包名+_preferences來作為SP的名稱。
1.2 具體的儲存實現步驟
1.獲取SP物件sharedPreferences。
2.呼叫SP物件的 edit() 方法獲取 SharedPreferences.Editor 物件editor。
3.向 SharedPreferences.Editor 物件editor中新增資料,使用 putXxx(String key, xxx value) 即可。比如存放int型別就通過 putInt(String key, int value) 即可。
4.呼叫SharedPreferences.Editor 物件editor的apply()方法提交新增的資料,完成資料儲存。
具體實現如下:
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt("keyint", 123);
editor.putString("keyString", "abc");
editor.putBoolean("keyboolean", false);
editor.apply();
可以通過 Device File Explorer 工具檢視是否生成了對應的檔案,它是通過XML格式進行資料管理。
2. 從對應的sp的xml檔案中讀取資料
讀取比較簡單,直接通過SP物件sharedPreferences中的 getXxx(String key, xxx defValue) 來進行操作即可,它與SharedPreferences.Editor 物件editor中的 putXxx(String key, xxx value) 是相互對應的。
其中 getXxx(String key, xxx defValue) 方法第一個引數表示鍵值,第二個引數表示預設值。也就是說當在sp的xml檔案中找不到相應的鍵,就會得到預設值。
具體實現如下:
SharedPreferences sharedPreferences = getSharedPreferences(getLocalClassName(), MODE_PRIVATE);
int keyInt = sharedPreferences.getInt("keyint", 100);
String keyString = sharedPreferences.getString("keyString", "aaa");
boolean keyBoolean = sharedPreferences.getBoolean("keyboolean", false);
float keyFloat = sharedPreferences.getFloat("keyFloat", 3.333f);
Log.d("show", keyInt + " " + keyString + " " + keyBoolean + " " + keyFloat);
根據1.2中的例子可以得出如下的結果:
前面三個的鍵都存在,所以預設值就沒有用到,最後一個鍵不存在,所以用到預設值。