zoukankan      html  css  js  c++  java
  • 内部存储文件(读)

    未进行优化的代码:

    实现功能要点:

      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 {
    
        @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.当该应用第一次启动时,是无法读取账号密码的

                          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;
        @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();
        }
    }
  • 相关阅读:
    洛谷P2389 电脑班的裁员(区间DP)
    停更祭
    搜索 水题&&错误集锦
    模板——最小生成树prim算法&&向前星理解
    单源最短路dijkstra算法&&优化史
    模板——最小生成树kruskal算法+并查集数据结构
    卡常三连(快读快写+re)
    模板——STL队列
    起点
    《2016年十一月十三日周总结》
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/4876798.html
Copyright © 2011-2022 走看看