内部存储文件(读)
未進行優化的代碼:
實現功能要點:
? 1. 當輸入用戶密碼后點擊登錄時,首先判斷是否勾選了復選框,若勾選了,將用戶名、密碼通過文件寫的方法寫入到內部存儲info.txt中。
? 2. 當應用啟動后,執行函數readAccount()函數,該函數通過文件讀方法(只獲取一行)并將該行字符串分割后顯示在用戶名和密碼框中。
代碼如下:
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 {@Overrideprotected 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.當該應用第一次啟動時,是無法讀取賬號密碼的
? ? ? ? ? ? ? ? ? ? ? 2.當用戶在之后的某一次不選擇記住賬戶名和密碼,那么應該將txt文件清空,而不是之前的舊賬號密碼
優化解決(代碼優化和第一次啟動判斷文件存在):
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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//已經是全局變量,應用啟動時獲取IDet_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();
}
}
?
轉載于:https://www.cnblogs.com/shuqingstudy/p/4876798.html
總結
- 上一篇: 离散数学A
- 下一篇: HTML5新增的标签