1. 程式人生 > >Android中的資料儲存一(檔案儲存、SharedPreferences儲存)

Android中的資料儲存一(檔案儲存、SharedPreferences儲存)

一.檔案儲存

檔案儲存不對儲存的內容進行處理,適合用於儲存一些簡單的文字資料或二進位制資料。如果要儲存較為複雜的文字資料,就要定義一套自己的格式規範。

1.將資料儲存到檔案中

Context類中有一個 openFileOutput(String name, int mode) 的方法,是用於將資料儲存到指定的檔案中,它的返回值為 FileOutputStream,其中有兩個引數,前者表示檔名稱(其中不能包含路徑名,其路徑都是在/data/data/包名/files/目錄下),後者表示操作模式,有MODE_PRIVATE(預設模式,檔案存在時覆蓋其中的內容)MODE_APPEND(檔案存在,就往檔案的末尾新增資料

)兩種。得到了 FileOutputStream 物件後就通過Java流將資料寫入到檔案。具體的實現如下:

// 將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中的例子可以得出如下的結果:

前面三個的鍵都存在,所以預設值就沒有用到,最後一個鍵不存在,所以用到預設值