保存数据到android的rom空间

android存储空间介绍:

       Rom:相当于一块硬盘(微硬盘)能持久的储存一些数据,如手机掉电,之前的用户数据依然会被保存,,一般空间为1G~32G

       Ram:相当于电脑里面的内存条,掉电不能保存用户数据,运行速度比较快。一般的Ram空间为512M~1G

       SD卡:相当于一个外部的U盘,不是一个必须设备
保存数据到android的rom空间_第1张图片




需求:用户输入用户名和密码后选择保存的位置,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();
   }
}

MainActivity.java

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中需要加入写入数据到外部存储卡的权限:



    
    

    
        
            
                

                
            
        
    






你可能感兴趣的:(保存数据到android的rom空间)