未進行優化的代碼: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(); } }