未进行优化的代码:java
实现功能要点:android
1. 当输入用户密码后点击登陆时,首先判断是否勾选了复选框,若勾选了,将用户名、密码经过文件写的方法写入到内部存储info.txt中。数组
2. 当应用启动后,执行函数readAccount()函数,该函数经过文件读方法(只获取一行)并将该行字符串分割后显示在用户名和密码框中。app
代码以下:ide
package com.swust.intern; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //应用启动后,读取存档的用户名和密码 readAccount(); } public void readAccount(){ File file =new File("data/data/com.swust.intern/info.txt"); try{ FileInputStream fis =new FileInputStream(file); //把字节流转化为字符流 BufferedReader br =new BufferedReader(new InputStreamReader(fis)); //读取txt文件的用户名和密码 //读取一行 String text =br.readLine(); //使用“##”标识切割,获得字符串数组 String[] s = text.split("##"); EditText et_name = (EditText) findViewById(R.id.et_name); EditText et_pwd = (EditText) findViewById(R.id.et_pwd); et_name.setText(s[0]); et_pwd.setText(s[1]); }catch (Exception e){ e.printStackTrace(); } } public void login(View v){ EditText et_name = (EditText) findViewById(R.id.et_name); EditText et_pwd = (EditText) findViewById(R.id.et_pwd); CheckBox cb = (CheckBox)findViewById(R.id.cb); String name=et_name.getText().toString(); String pwd =et_pwd.getText().toString(); //判读复选框是否被勾选 if(cb.isChecked()){ //"data/data/com.swust.intern"是内部存储空间路径 File file =new File("data/data/com.swust.intern/info.txt"); FileOutputStream fos; try{ fos = new FileOutputStream(file); //加“##”是为了读取时好分割 fos.write((name + "##" +pwd).getBytes()); fos.close(); }catch (Exception e){ e.printStackTrace(); } } //System.out.println("登录成功"); //建立吐司对话框 /* 第一个参数上context,而activity原本就是context的子类,因此直接填this*/ /*第三个参数为持续显示时间,只有LENGTH_SHORT(2S)和LENGTH_LONG(5s)两种选择*/ /*Toast t= Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT); //显示吐司对话框 t.show();*/ Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show(); } }
固然,有缺点:函数
第一,代码不够优化,findById方法实现屡次,应该使用全局变量来解决。优化
第二,逻辑漏洞,1.当该应用第一次启动时,是没法读取帐号密码的this
2.当用户在以后的某一次不选择记住帐户名和密码,那么应该将txt文件清空,而不是以前的旧帐号密码spa
优化解决(代码优化和第一次启动判断文件存在):code
package com.swust.intern; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText et_name; private EditText et_pwd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //已是全局变量,应用启动时获取ID et_name = (EditText) findViewById(R.id.et_name); et_pwd = (EditText) findViewById(R.id.et_pwd); //应用启动后,读取存档的用户名和密码 readAccount(); } public void readAccount(){ File file =new File("data/data/com.swust.intern/info.txt");
//判读文件是否存在
if(file.exists()){
try{
FileInputStream fis =new FileInputStream(file);
//把字节流转化为字符流
BufferedReader br =new BufferedReader(new InputStreamReader(fis));
//读取txt文件的用户名和密码
//读取一行
String text =br.readLine();
//使用“##”标识切割,获得字符串数组
String[] s = text.split("##");
et_name.setText(s[0]);
et_pwd.setText(s[1]);
}catch (Exception e){
e.printStackTrace();
}
}
} public void login(View v){ CheckBox cb = (CheckBox)findViewById(R.id.cb); String name=et_name.getText().toString(); //直接使用 String pwd =et_pwd.getText().toString(); //判读复选框是否被勾选 if(cb.isChecked()){ //"data/data/com.swust.intern"是内部存储空间路径 File file =new File("data/data/com.swust.intern/info.txt"); FileOutputStream fos; try{ fos = new FileOutputStream(file); //加“##”是为了读取时好分割 fos.write((name + "##" +pwd).getBytes()); fos.close(); }catch (Exception e){ e.printStackTrace(); } } //System.out.println("登录成功"); //建立吐司对话框 /* 第一个参数上context,而activity原本就是context的子类,因此直接填this*/ /*第三个参数为持续显示时间,只有LENGTH_SHORT(2S)和LENGTH_LONG(5s)两种选择*/ /*Toast t= Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT); //显示吐司对话框 t.show();*/ Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show(); } }