android存储空间介绍:

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

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

       SD卡:相当于一个外部的U盘,不是一个必须设备

android sd数据存储 android 存储空间_android




需求:用户输入用户名和密码后选择保存的位置,rom,cache,SD代表以指定文件格式保存在不同的位置。xml代表把用户输入的数据以xml格式保存。

选择了保存方式,点击记住密码并登陆以后,退出应用,对应的用户名,密码输入框会回显用户之前输入的数据。


要实现的功能如上图,布局文件fragment_main.xml 如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.lenovo.login.MainActivity$PlaceholderFragment" >

    <TextView
        android:id="@+id/text_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/input_login" />
    
    <EditText 
        android:id="@+id/et_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:layout_below="@id/text_login"
        android:hint="@string/username"/>
     <TextView
        android:id="@+id/text_pwd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/et_name"
        android:text="@string/input_pwd" />
    <EditText 
        android:id="@+id/et_pwd"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:layout_below="@id/text_pwd"
        android:hint="@string/password"/>
    
     <RadioGroup 
         android:id="@+id/rg"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
         android:layout_below="@id/et_pwd" >
        
        <RadioButton 
             android:id="@+id/rb_rom"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/rom"/>
        <RadioButton 
             android:id="@+id/rb_cache"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/cache"/>
        <RadioButton
             android:id="@+id/rb_sd" 
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/sd"/>
         <RadioButton
             android:id="@+id/rb_xml" 
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/xml"/>
    </RadioGroup>
    <RelativeLayout 
        android:id="@+id/rl"
         android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/rg">
        <CheckBox 
            android:id="@+id/cb_remeber"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/remember"/>
        <Button 
            android:id="@+id/bt_login"
            android:layout_alignParentRight="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/login_in" />
    </RelativeLayout>
</RelativeLayout>

对应的strings.xml为:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">login</string>
    <string name="action_settings">Settings</string>
    <string name="input_login">请输入用户名</string>
    <string name="username">用户名</string>
    <string name="input_pwd">请输入密码</string>
    <string name="password">密码</string>
    <string name="remember">记住密码</string>
    <string name="login_in">登录</string>
    <string name="msg">用户名或密码不应为空</string>
    <string name="rom">rom</string>
    <string name="cache">cache</string>
    <string name="sd">SD</string>
    <string name="xml">xml</string>
</resources>

保存用户输入数据到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<String,String>  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<String,String> map=new HashMap<String, String>();
		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<String, String> 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中需要加入写入数据到外部存储卡的权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lenovo.login"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="15"
        android:targetSdkVersion="18" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.lenovo.login.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>