SharedPreferences和File

一,SharedPreferences:

(1)簡稱:SP存儲

(2)位置:用它時,將會默認在data/data/包名/下創建一個名字爲:shared_prefs的文件夾,

   然後再在shared_prefs目錄下創建你命名的文件.

(3)創建步驟:

<1>獲取上下文的SharedPreferences對象

<2>調用剛剛獲取的SharedPreferences對象的editor()方法,返回一個Editor對象

        <3>用editor對象的putXXX(參數1 ,參數2):方法來存儲數據,是類似一個map集合存儲

  <4>調用editor對象的commit()方法提交數據

現在一般用apply()提交,以前用commit()

(4)創建舉例:

 //1,獲取上下文對象的SharedPreferences對象  ,第一個參數:文件名,第二個:權限類型
        SharedPreferences  sp  =  context.getSharedPreferences("configure" , Context.MODE_PRIVATE);
        //2,獲取Editor對象
        Editor editor = sp.edit();
        //3.存放數據
        editor.putString("username" , username);
        editor.putString("password" , password);
        editor.putFloat("float" , 12);
        //4.用editor.commit()方法提交
        editor.commit();

第4步,改爲:

editor.apply(); //以前都是用commit

(5)取出數據:

<1>獲取剛剛創建的SharedPreferences對象,並傳入文件名和mode類型

<2> 調用SharedPreferences對象的getXXX方法,取出鍵值對,

如:

/調用方法保存
                       SaveLogin.saveLoginMessage(LoginActivity.this , strName , strWord );
                       //1.獲取SharedPreferences對象
                       SharedPreferences sp =  getSharedPreferences("configure" , Context.MODE_PRIVATE);
                       String sName = sp.getString("username" , "");
                       String sWord = sp.getString("password" , "");
                       Float  flt   = sp.getFloat("float" , 0);
                       Toast.makeText(LoginActivity.this , "名字是:" + sName + "\n密碼: " +
                               sWord + "\n 值:" + flt, Toast.LENGTH_SHORT).show();


2,commit()與apply()比較:爲什麼現在常用apply提交?

看一下源碼註釋,大概意思:

    /**commit與apply()的區別
     * 1. apply沒有返回值而commit返回boolean表明修改是否提交成功
     2. apply是將修改數據原子提交到內存, 而後異步真正提交到硬件磁盤,
     而commit是同步的提交到硬件磁盤,因此,在多個併發的提交commit的時候,
     他們會等待正在處理的commit保存到磁盤後在操作,從而降低了效率。
     而apply只是原子的提交到內容,後面有調用apply的函數的將會直接覆蓋前面的內存數據,
     這樣從一定程度上提高了很多效率。
     3. apply方法不會提示任何失敗的提示。
     由於在一個進程中,sharedPreference是單實例,一般不會出現併發衝突,
     如果對提交的結果不關心的話,建議使用apply,當然需要確保提交成功且有後續操作的話,
     還是需要用commit的*/

3,利用sp最常見的例子無疑就是記住用戶名和密碼,例子在最下面....


二,File存儲:(java文件存取大家都很熟悉,就,,,)

1,簡意:利用文件來存儲

2,向文件寫入:

相關:FileOutputStream---文件輸出流

                   BufferedWriter


3,從文件中讀取數據:

相關:FileInputStream

   BufferedReader


很簡單的例子:

    /**
     * FiLe存儲監聽
     * @param view
     */
    @OnClick(R.id.file_save)
    public void save(View view){

        //獲取輸入
        String str = mEdtInput.getText().toString().trim();

        //判空:null或者空字符串
        if(!TextUtils.isEmpty(str)){
            //文件輸出流與BufferedWriter
            FileOutputStream out = null;
            BufferedWriter writer = null;

            //寫入
            try{
                out =   openFileOutput("data" , Context.MODE_PRIVATE);
                writer = new BufferedWriter(new OutputStreamWriter(out));
                writer.write(str);

            }catch (IOException e){
                e.printStackTrace();
            }finally {
                if(writer != null){
                    try {
                        //關閉流
                        writer.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            Toast.makeText(MainActivity.this , "save Success" , Toast.LENGTH_SHORT).show();

        }else {
            Toast.makeText(MainActivity.this , "save failure" , Toast.LENGTH_SHORT).show();
        }
    }


    /**
     * 文件讀取
     * @param view
     */
    @OnClick(R.id.read)
    public void read(View view){
        //文件輸入流與BufferedReader對象
        FileInputStream in = null;
        BufferedReader reader = null;
        //用於追加結果
        StringBuffer content = new StringBuffer();

        //讀取
        try {
            in = openFileInput("data");
            reader = new BufferedReader(new InputStreamReader(in));
            String line = "";
            while ((line = reader.readLine()) != null){
                content.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //關閉流
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        //結果:判空並顯示
        String result = content.toString();
        if(!TextUtils.isEmpty(result)){
            mEdtInput.setText(result);
            mEdtInput.setSelection(result.length());
            Toast.makeText(MainActivity.this , "read Success" , Toast.LENGTH_SHORT).show();
        }else {
            mEdtInput.setText("");
            Toast.makeText(MainActivity.this , "read failure" , Toast.LENGTH_SHORT).show();
        }
    }

4:常用方法

        //判斷是否插入sd卡
        Environment.getExternalStorageState();
        //獲取外部存儲器路徑,也就是SD卡目錄
        Environment.getExternalStorageDirectory();
        //(3)常用讀寫sd卡文件方法
        FileInputStream,FileOutputStream, FileReader, FileWriter


        //在應用程序下獲取或創建name對應的子目錄
        public File getDir(String name, int mode)
        
        //獲取該應用程序的數據文件的絕對路徑
        File getFilesDir();


三,一個記住用戶名和密碼例子:

佈局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="60dp">
        <TextView
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:textSize="18sp"
            android:text="Account:" />

        <EditText
            android:id="@+id/account"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_gravity="center_vertical"/>
    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="60dp">
        <TextView
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:textSize="18sp"
            android:text="Password:" />

        <EditText
            android:id="@+id/password"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_gravity="center_vertical"
            android:inputType="textPassword" />
    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <CheckBox
            android:id="@+id/remember_pass"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:text="Remember password" />

    </LinearLayout>

    <Button
        android:id="@+id/login"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="Login" />

</LinearLayout>

Activity:

public class LoginActivity extends AppCompatActivity {

    //用戶名
    @ViewInject(R.id.account)
    private EditText accountEdit;

    //密碼
    @ViewInject(R.id.password)
    private EditText passwordEdit;

    //登錄
    @ViewInject(R.id.login)
    private Button login;

    //記住密碼checkBox
    @ViewInject(R.id.remember_pass)
    private CheckBox rememberPass;

    //pref,pref.editor對象
    private SharedPreferences pref;
    private  SharedPreferences.Editor editor ;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        //初始化inject
        ViewUtils.inject(this);

        //獲取pref
        pref = PreferenceManager.getDefaultSharedPreferences(this);
        //判斷是否選中記住密碼
        boolean isRemember = pref.getBoolean("remember_password" , false);
        if(isRemember){
            String account = pref.getString("account" , "");
            String password = pref.getString("password" , "");
            accountEdit.setText(account);
            passwordEdit.setText(password);
            rememberPass.setChecked(true);  //設置選中
        }

    }


    /**
     * 登錄
     * @param view
     */
    @OnClick(R.id.login)
    public void toLogin(View view){

        //獲取用戶名和密碼
        String account = accountEdit.getText().toString().trim();
        String password = passwordEdit.getText().toString().trim();

        //判斷用戶名和密碼是否正確
        if(account.equals("maiyu") && password.equals("123456")){
            //獲取pref.edit()
            editor = pref.edit();
            //判斷是否選中記住密碼,是的話存儲pref
            if(rememberPass.isChecked()){
                editor.putBoolean("remember_password" , true);
                editor.putString("account" , account);
                editor.putString("password" , password);
            }else {
                editor.clear();     //不存儲
            }
            editor.apply();
            //跳轉
            Intent intent = new Intent(LoginActivity.this , TestActivity.class);
            startActivity(intent);
            finish();
        }else {
            //密碼或用戶名錯誤
            Toast.makeText(LoginActivity.this , "account or password is unvalid",Toast.LENGTH_SHORT).show();
        }
    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章