Android下的文件的存储案例(此处以qq登录界面的帐号和密码的保存作为实例)
首先是res/layout/activity_main.xml中的代码:
<LinearLayout 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:orientation="vertical"
android:gravity="center_horizontal"
tools:context=".MainActivity" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/qq"
/>
<EditText
android:id="@+id/et_qq"
android:inputType="number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入QQ号"
/>
<EditText
android:id="@+id/et_password"
android:inputType="textPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码"
/>
<CheckBox
android:id="@+id/cb_remember"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="记住密码"
/>
<Button
android:onClick="loginQQ"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="登录"
/>
</LinearLayout>
可以实现如下的qq登录的界面:
实现代码的编写:
package com.itcast.FileStoreSubmit;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_qq;
private EditText et_password;
private CheckBox cb_remember;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_qq= (EditText) findViewById(R.id.et_qq);
et_password= (EditText) findViewById(R.id.et_password);
cb_remember= (CheckBox) findViewById(R.id.cb_remember);
}
public void loginQQ(View view){
String qq = et_qq.getText().toString().trim();
String password = et_password.getText().toString().trim();
if(qq.equals("")||password.equals("")){
Toast.makeText(this, "qq号或者密码不能为空", 0).show();
return;
}
if(cb_remember.isChecked()){
System.out.println("保存qq和密码");
}else{
System.out.println("不需要保存密码和qq");
}
}
}
以上只是简单的实现qq的登录界面,下面实现数据的保存:
public class MainActivity extends Activity {
private EditText et_qq;
private EditText et_password;
private CheckBox cb_remember;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_qq= (EditText) findViewById(R.id.et_qq);
et_password= (EditText) findViewById(R.id.et_password);
cb_remember= (CheckBox) findViewById(R.id.cb_remember);
}
public void loginQQ(View view){
String qq = et_qq.getText().toString().trim();
String password = et_password.getText().toString().trim();
if(qq.equals("")||password.equals("")){
Toast.makeText(this, "qq号或者密码不能为空", 0).show();
return;
}
if(cb_remember.isChecked()){
System.out.println("保存qq和密码");
}else{
System.out.println("不需要保存密码和qq");
}
try {
//File file=new File("zpf.txt");//这样保存会出错应该写成/data/data/包名/路径名...
File file=new File("/data/data/com.itcast.FileStoreSubmit/zpf.txt");
FileOutputStream fos=new FileOutputStream(file);
fos.write((qq+"##"+password).getBytes());
fos.close();
Toast.makeText(this,"qq和密码保存成功",0).show();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(this,"qq和密码保存失败",0).show();
}
}
}
注意:无论此处是否勾选了”保存密码”的勾选框,输入的qq和密码都会被保存下来!但是退出程序后再次进入界面如下:
接下来实现退出qq,下次进入qq登录界面后,依旧有上次保存的qq和密码的操作,即是将保存的数据回写到文本框.
代码如下:
public class MainActivity extends Activity {
private EditText et_qq;
private EditText et_password;
private CheckBox cb_remember;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_qq= (EditText) findViewById(R.id.et_qq);
et_password= (EditText) findViewById(R.id.et_password);
cb_remember= (CheckBox) findViewById(R.id.cb_remember);
File file=new File("/data/data/com.itcast.FileStoreSubmit/qwer.txt");
if(file.isFile()&&file.length()>0){
try {
FileInputStream fis=new FileInputStream(file);
BufferedReader br=new BufferedReader(new InputStreamReader(fis));
String string = br.readLine();
String qq=string.split("##")[0];
String password=string.split("##")[1];
et_qq.setText(qq);
et_password.setText(password);
}catch (IOException e) {
e.printStackTrace();
}
}
}
public void loginQQ(View view){
String qq = et_qq.getText().toString().trim();
String password = et_password.getText().toString().trim();
if(qq.equals("")||password.equals("")){
Toast.makeText(this, "qq号或者密码不能为空", 0).show();
return;
}
if(cb_remember.isChecked()){
//System.out.println("保存qq和密码");
try {
//File file=new File("zpf.txt");//这样保存会出错应该写成/data/data/包名/路径名...
File file=new File("/data/data/com.itcast.FileStoreSubmit/qwer.txt");
FileOutputStream fos=new FileOutputStream(file);
fos.write((qq+"##"+password).getBytes());
fos.close();
Toast.makeText(this,"qq和密码保存成功",0).show();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(this,"qq和密码保存失败",0).show();
}
}else{
Toast.makeText(this, "没有保存qq和密码", 0).show();
}
}
}
Runas android project之后:
输入qq和密码,并且选择不勾选保存密码的选框:
在DDMS中并没有找到”qwer.txt”文件:
接下来重新runas android project,这次选择保存qq和密码:
QQ和密码保存了,推出后再进入的界面如下:
可以看到数据已经保存,并且回写到了文本框.but,这里任然有一个小小的bug存在,如果第一次登录的时候记录了密码,qq和密码保存了下来,第二次登录选择不记住密码,登陆后出现未保存密码的Toast,退出后继续登录,qq帐号和密码又会保存下来!!!
针对这个bug,联想一下腾讯qq的登录(如果是记住密码,推出后下次登录,qq和密码都存在,如果是不记住密码,仍然会保存qq ),这里做以下处理:
=======================qq和密码保存的改进=======================
1.File file=newFile("/data/data/com.itcast.FileStoreSubmit/qwer.txt");
这种方式的保存并不可取,因为不同的手机生产商给出的路径不一样,所以路径选择用File file=new File(getFilesDir(),"gg.txt");或者
File file=new File(getCacheDir(),"gg.txt");这两种方式.前者删除的时候会有一个”确认”的提示框,后者不需要任何提示直接删除.
2.用FileOutputStream和FileInputStream方式的保存(读取的时候用了”##”来切割保存的数据),如果在密码中出现了”##”这样的特殊字符就会出现问题,因此针对此方法有了sharedpreferences.保存的是xml文件,在写文件路径的时候不需要加.xml后缀名.
=====================================day03=====================================
一.利用StringBuilder生成xml文件,注意添加的时候标签成对存在.
二.StringBuilder生成xml文件,在窗口输入特殊字符的时候eg:”</...”;会因为xml格式里面的<></>出现异常匹配.从而导致数据的保存不成功.利用xml序列化器生成xml文件可以解决这个问题!