android存储空间介绍:
Rom:相当于一块硬盘(微硬盘)能持久的储存一些数据,如手机掉电,之前的用户数据依然会被保存,,一般空间为1G~32G
Ram:相当于电脑里面的内存条,掉电不能保存用户数据,运行速度比较快。一般的Ram空间为512M~1G
需求:用户输入用户名和密码后选择保存的位置,rom,cache,SD代表以指定文件格式保存在不同的位置。xml代表把用户输入的数据以xml格式保存。
选择了保存方式,点击记住密码并登陆以后,退出应用,对应的用户名,密码输入框会回显用户之前输入的数据。
要实现的功能如上图,布局文件fragment_main.xml 如下:
对应的strings.xml为:
login
Settings
请输入用户名
用户名
请输入密码
密码
记住密码
登录
用户名或密码不应为空
rom
cache
SD
xml
保存用户输入数据到rom
public class FileService {
/**
* save data to phone rom
* @param context 上下文
* @param fileName 保存的文件名
* @param name 用户名
* @param password 密码
* @return
*/
public static boolean saveToRom(Context context,String fileName,String name,String password){
// File file = new File("/data/data/cn.itcast.login/a.txt");
//相当于存储到/data/dat/packageName/目录下
File file = new File(context.getFilesDir(), fileName);
// 如果没有指定访问的模式 ,文件的模式 默认是私有的权限.
// 只有当前的应用程序可以读写这个文件 ,别的应用程序是不可以操作这个文件.
try {
FileOutputStream fos=new FileOutputStream(file);
fos.write((name+":"+password).getBytes());
fos.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 保存数据到手机的rom空间的缓存目录
* 作用 保存应用程序的临时数据, 在手机内存不足的时候 系统会释放掉这块空间
* 用户也可以手工的释放掉这块空间
* @param context 上下文
* @param filename 保存的文件名
* @param name 用户名
* @param password 密码
* @return
*/
public static boolean saveToRomCache(Context context,String fileName,String name,String password){
File file=new File(context.getCacheDir(),fileName);///data/dat/packageName/
try {
FileOutputStream fos=new FileOutputStream(file);
fos.write((name+":"+password).getBytes());
fos.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* sava data to externalStorage【外部存储卡】
* @param context
* @param fileName
* @param name
* @param password
* @return
*/
public static boolean saveToSD(Context context,String fileName,String name,String password){
//相当于存储到/mnt/sdcard/目录下
//在保存数据到sd卡之前 ,最好判断一下 用户是否有sd卡 sd是否可用.
File file=new File(Environment.getExternalStorageDirectory(),fileName);
try {
FileOutputStream fos=new FileOutputStream(file);
fos.write((name+":"+password).getBytes());
fos.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将用户输入的数据以xml文件格式保存到手机rom空间
* @param context
* @param name
* @param password
* @return
*/
public static boolean saveToXML(Context context,String name,String password){
File file=new File(context.getFilesDir(),"info.xml");
try {
FileOutputStream fos=new FileOutputStream(file);
XmlSerializer serial=Xml.newSerializer();
//初始化一下xml的序列化器
serial.setOutput(fos, "UTF-8");
serial.startDocument("UTF-8", true);
serial.startTag(null, "map");
serial.startTag(null, "name");
serial.text(name);
serial.endTag(null, "name");
serial.startTag(null, "password");
serial.text(password);
serial.endTag(null, "password");
serial.endTag(null, "map");
serial.endDocument();
fos.flush();
fos.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 从rom文件中读取存储的内容
* @param context
* @param fileName
* @return
*/
public static Map readFromRom(Context context,String fileName){
File file=new File(context.getFilesDir(),fileName);
try {
FileInputStream fis=new FileInputStream(file);
byte[] result=StreamTools.getBytes(fis);
String[] data=new String(result).split(":");
String name=data[0];
String password=data[1];
Map map=new HashMap();
map.put("name", name);
map.put("password", password);
return map;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
普通方式读取保存在文件中的数据工具类:
public class StreamTools {
/**
* 把一个输入流里的内容转化存放在一个byte数组里面
* @param is
* @return
* @throws Exception
*/
public static byte[] getBytes(InputStream is) throws Exception{
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=0;
while((len=is.read(buffer))!=-1){
baos.write(buffer,0,len);
}
is.close();
return baos.toByteArray();
}
}
public class MainActivity extends Activity implements OnClickListener {
private EditText et_name;
private EditText et_pwd;
private CheckBox cb_remember;
private Button bt_login;
private RadioGroup rg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
et_name=(EditText) findViewById(R.id.et_name);
et_pwd=(EditText) findViewById(R.id.et_pwd);
cb_remember=(CheckBox) findViewById(R.id.cb_remeber);
bt_login=(Button) findViewById(R.id.bt_login);
rg=(RadioGroup) findViewById(R.id.rg);
//回显之前用户输入的数据到对象的文本编辑框
// Map map=FileService.readFromRom(this, "rom.txt");
// if(map!=null){
// String name=map.get("name");
// String pwd=map.get("pwd");
// et_name.setText(name);
// et_pwd.setText(pwd);
// }
//用sharedpreference获取保存在xml中的数据
SharedPreferences sp=getSharedPreferences("xml", MODE_PRIVATE);
String name=sp.getString("name", "");
String pwd= sp.getString("password", "");
et_name.setText(name);
et_pwd.setText(pwd);
bt_login.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v==bt_login){
String name=et_name.getText().toString().trim();
String pwd=et_pwd.getText().toString().trim();
if(TextUtils.isEmpty(name) || TextUtils.isEmpty(pwd)){
Toast.makeText(this, R.string.msg, 0).show();
return;
}
//if checked,save name and password
if(cb_remember.isChecked()){
int id=rg.getCheckedRadioButtonId();
if(id==-1)
//if does not check any radioButton,default the data on rom
id=R.id.rb_rom;
boolean result=false;
switch (id) {
case R.id.rb_rom:
result=FileService.saveToRom(this,"rom.txt",name, pwd);
break;
case R.id.rb_cache:
result=FileService.saveToRomCache(this,"cache.txt",name, pwd);
break;
case R.id.rb_sd:
//get externalStorage's state,sdCard is or not available
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
result=FileService.saveToSD(this, "sd.txt", name, pwd);
}else{
Toast.makeText(this, "sd卡不可用,请检查sd卡状态", 0).show();
}
break;
case R.id.rb_xml:
//以前保存数据到xml文件的写法
// result=FileService.saveToXML(this, name, pwd);
//sharedPreference用于保存用户输入的数据到xml文件
SharedPreferences sp=getSharedPreferences("xml", MODE_PRIVATE);
//获取一个SharedPreferences编辑器
Editor editor=sp.edit();
editor.putString("name", name);
editor.putString("password", pwd);
editor.commit();
result = true;
break;
}
if(result){
Toast.makeText(this, "保存成功", 0).show();
}else{
Toast.makeText(this, "保存失败", 0).show();
}
}
if("zhangsan".equals(name)&&"123".equals(pwd)){
Toast.makeText(this, "登录成功", 0).show();
}else{
Toast.makeText(this, "登录失败", 0).show();
}
}
}
}
在AndroidManifest.xml中需要加入写入数据到外部存储卡的权限: