1. 程式人生 > >Android:回車儲存到SharePreference異常

Android:回車儲存到SharePreference異常

背景

在專案中發現,當通過SharePreference儲存一個回車。如果重新安裝應用,這個回車讀出來的值就改變了。

分析

通過讀取儲存時候的EditText裡面的String值,通過toCharArray轉換成char陣列,列印每個陣列的ascii碼。發現輸出是10,10.也就是回車對應的ascii碼。
重新安裝應用,從SharePreference裡面讀取儲存的回車值,再次列印char陣列,發現該陣列為:10,32,10,32,32. 跟視覺上的異常情況類似。
懷疑是char值轉換成String的時候出現異常。

解決方法

不使用SharePreference來儲存特殊字元,而是採用讀寫檔案的方式。經過驗證,解決該問題。在onPause的時候writeFile,然後在onCreate的時候readFile並且設定到EditText中即可。多個數值之間用冒號分隔。
程式碼如下:

private void writeFile()
{
    try {
        FileOutputStream fos = openFileOutput(FILE_NAME, MODE_PRIVATE);
        CharSequence prefix = mPrefix.getText();//mPrefix和mSuffix為EditText
        CharSequence suffix = mSuffix.getText();
        String writeResult = prefix+":"+suffix;
        fos.write(writeResult.getBytes());
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void readFile(){
    String result = "";
    try {
        FileInputStream fis = openFileInput(FILE_NAME);
        int len = fis.available();
        if(len <= 0)
        {
            return;
        }
        byte[] buffer = new byte[len];
        fis.read(buffer);
        result = new String(buffer, "UTF-8");
        String[] split = result.split(":");
        sPrefix = split[0];
        sSuffix = split[1];
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}