android 文件存储以及SharedPreferences存储以及模拟记住密码

1、文件存储

文件存储是android最基本的一种数据存储方式,他不会对存储的内容进行任何格式化的处理,所有数据都原封不动的保存在文件当中。

1.1 将数据存储到文件当中

Context类提供了一个openFileOutput()方法,该方法接受两个参数,第一个是创建的文件名,不可以包含路径,默认存储在data/data/<package name>/files/目录下。第二个参数是文件的操作模式,有两种可选,MODE_PRIVATE(覆盖原内容)与MODE_APPEND(在原内容后追加)。该方法返回一个FileOutputStream对象,然后使用java IO流进行存储。

1.2 从文件中读取数据

Context类还提供了一个openFileInput()方法,给方法接受一个参数,即要读取的文件名字,该方法会自动在data/data/<package name>/files/目录下找到该文件,然后返回一个FIleInputStream对象,使用Java IO进行读取。


使用例子


界面包含一个输入框,还有两个按钮,一个用来存储,一个用来读取,布局代码不再给出


存储的方法

public void save(String fileName, String data) {
		FileOutputStream out = null;
		BufferedWriter writer = null;

		try {
			out = openFileOutput(fileName, Context.MODE_PRIVATE);
			writer = new BufferedWriter(new OutputStreamWriter(out));
			writer.write(data);
			Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_LONG).show();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (writer != null) {
					writer.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

读取的方法

public String read(String fileName) {
		FileInputStream in = null;
		BufferedReader reader = null;
		StringBuilder content = new StringBuilder();

		try {
			in = openFileInput(fileName);
			reader = new BufferedReader(new InputStreamReader(in));
			String line = "";
			while ((line = reader.readLine()) != null) {
				content.append(line);
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return content.toString();
	}

在对按钮点击事件作出处理后,运行程序即可看到Toast出来的就是刚才保存的内容


2、SharedPreferences存储

SharedPreferences是采用键值对的方式存储数据的,存储数据的时候需要给该条数据提供一个键,然后读取数据的时候通过这个键把数据读取出来。


2.1 将数据存储到SharedPreferences中

首先获得SharedPreferences对象,我们一般通过Context类提供的getSharedPreferences()方法来得到,该方法需要传递两个参数,第一个是指定的文件名称,如果该文件不存在,会自动创建一个,文件默认存储在 data/data/<package name>/shared_prefs中,第二个是指定的操作模式,有两种模式可供选择,MODE_PRIVATE表示只有当前的应用程序才可以对文件进行读写)和MODE_MULTI_PROCESS(用于多个进程同时对该SharedPreferences文件进行操作的情况)。

得到SharedPreferences对象后的操作

2.1.1  调用SharedPreferences对象的edit()方法来获得一个SharedPreferences.Editer对象

2.1.2  通过Editer对象添加数据,例如editer,putString(key,value);

2.1.3  调用commit()方法将操作的数据进行提交


2.2 从SharedPreferences中读取数据

读取数据相对简单一些,只需要得到一个SharedPrefences对象,然后调用它的一系列get()方法就可以得到相应的数据了。


使用例子



界面包含一个姓名输入框和一个年龄输入框,一个保存按钮,一个读取按钮。布局代码不再给出

处理代码

public class SecondActivity extends BaseActivity implements OnClickListener {

	private Button mReadButton;
	private Button mSaveButton;
	private EditText mNameEditText;
	private EditText mAgeEditText;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_second);
	}

	@Override
	public void findId() {
		mReadButton = (Button) findViewById(R.id.second_read_Button);
		mSaveButton = (Button) findViewById(R.id.second_save_Button);
		mNameEditText = (EditText) findViewById(R.id.second_nameEditText);
		mAgeEditText = (EditText) findViewById(R.id.second_age_EditText);
	}

	@Override
	public void setListener() {
		mReadButton.setOnClickListener(this);
		mSaveButton.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		//保存信息
		case R.id.second_save_Button:
			String name=mNameEditText.getText().toString();
			int age=Integer.parseInt(mAgeEditText.getText().toString());
			//得到Editer对象
			SharedPreferences.Editor editor=getSharedPreferences("SPxu", MODE_PRIVATE).edit();
			editor.putString("name", name);
			editor.putInt("age", age);
			editor.commit();

			break;
			//读取信息
		case R.id.second_read_Button:
			SharedPreferences preferences=getSharedPreferences("SPxu", MODE_PRIVATE);
			String mName=preferences.getString("name", "");
			int mAge=preferences.getInt("age",0 );
			Toast.makeText(SecondActivity.this, "name is:"+mName+",age is:"+mAge, Toast.LENGTH_LONG).show();

			break;
		}

	}
}

运行程序,输入信息,点击保存,读取后即可看到读取到的效果。


3、对SharedPreferences的封装

我们可以采用单例模式对SharedPreferences进行封装,保证在当前应用程序只有一个SharedPreferences对象,并且封装了save方法、get方法以及clear方法,更加方便使用

新建一个类SPUtil

public class SPUtil {
	
	private static SharedPreferences mPreferences;
	private static SPUtil mSpUtil;
	private SPUtil(){};
	
	public static SPUtil getInstance(Context context){
		if(mSpUtil==null){
			mSpUtil=new SPUtil();
		}
		return initSP(context);
	}
	//初始化SharedPreferences对象
	private static SPUtil initSP(Context context){
		if(mPreferences==null){
			mPreferences=context.getSharedPreferences("SPxu", Context.MODE_PRIVATE);
		}
		return mSpUtil;
	}
	
	public void save(String key,String value){
		mPreferences.edit().putString(key, value).commit();
	}
	
	public String get(String key){
		return mPreferences.getString(key, "");
	}
	
	public void clear(){
		mPreferences.edit().clear().commit();
	}

}


可以将上一个例子做下修改,使用这个SPUtil类

保存信息

			String name=mNameEditText.getText().toString();
			String age=mAgeEditText.getText().toString();
			SPUtil.getInstance(this).save("name", name);
			SPUtil.getInstance(this).save("age", age);

读取信息

	
			String mName=SPUtil.getInstance(this).get("name");
			String mAge=SPUtil.getInstance(this).get("age");


可以看到很方便,并且保证了当前应用程序只有一个SharedPreferences对象,这个很关键


4、使用实例,实现记住密码功能

在前面的broadcast学习中,做了一个登陆界面,登陆过后点击按钮模拟强制下线,在那个例子中加入一个记住密码checkBox,并且使用了刚刚封装的SPutil类。



public class SecondActivity extends BaseActivity implements OnClickListener{
	
	private Button mLoginButton;
	private EditText mUserNameEditText;
	private EditText mPasswordEditText;
	private CheckBox mRememberCheckBox;
	
	
	private static final String TAG="Secondctivity";

	@Override
	public void findId() {
		mLoginButton=(Button) findViewById(R.id.login_loginButton);
		mUserNameEditText=(EditText) findViewById(R.id.login_userName_EditText);
		mPasswordEditText=(EditText) findViewById(R.id.login_password_EditText);
		mRememberCheckBox=(CheckBox) findViewById(R.id.login_rememberCheckBox);
	}

	@Override
	public void setListener() {
		mLoginButton.setOnClickListener(this);
	}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.login);
		//从SharedPreferences中获取数据是否记住密码
		String mIsRemember=SPUtil.getInstance(this).get("isRemember");
		if(mIsRemember.equals("true")){
			//如果是记住密码,再获取到用户名和密码,并显示
			mUserNameEditText.setText(SPUtil.getInstance(this).get("userName"));
			mPasswordEditText.setText(SPUtil.getInstance(this).get("password"));
			mRememberCheckBox.setChecked(true);
		}
	
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.login_loginButton:
			String userName=mUserNameEditText.getText().toString();
			String password=mPasswordEditText.getText().toString();
			
			if(userName.equals("user") && password.equals("123456")){
				if(mRememberCheckBox.isChecked()){
					//如果记住密码被选中了,将用户名和密码存储到SharedPreferences中,并设置记住密码
					SPUtil.getInstance(this).save("userName", userName);
					SPUtil.getInstance(this).save("password", password);
					SPUtil.getInstance(this).save("isRemember", "true");
					
				}else{
					//如果记住密码没被选中,就将SharedPreferences对象中的数据全部清空掉
					SPUtil.getInstance(this).clear();
				}
				startActivity(new Intent(SecondActivity.this,ThreeActivity.class));
				finish();
				
			}else{
				Toast.makeText(SecondActivity.this, "用户名或密码错误", Toast.LENGTH_LONG).show();
			}
			break;
		}
	}
	
	
}

运行程序,输入账号密码,选中记住密码,然后登陆,点击强制下线,然后重新出现的登陆界面就会自动存在用户名和密码了。当然这只是学习的例子,帐号和密码这样保存是极不安全的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值