一,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();
}
}
}