內部存儲文件(讀)

未進行優化的代碼: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();
    }
}
相關文章
相關標籤/搜索