美文网首页
存储数据到data目录中

存储数据到data目录中

作者: AR7_ | 来源:发表于2017-09-17 23:25 被阅读12次

    1、当应用安装到 Android 后,系统会根据每个应用的包名创建个/data/data/包名/的文件夹,访问自己包名下的目录是不需要权限的,并且 Android 已经提供了非常简便的 API 可以直接去访问该文件夹。下面以一个案例来演示 data 目录的使用。
    2、下面使用到了如下方法,这些方法都是在 ContextWrapper 类中定义的,是 Activity 的父类,因此可以直接使用。
    getFilesDir():直接获取 /data/data/包名/files 文件。
    openFileInput("info.txt"):直接打开/data/data/包名/files/info.txt 文件。
    openFileOutput("info.txt", MODE_PRIVATE):直接创建 /data/data/包名/files/info.txt 文件。
    在开发过程中凡是涉及到 data 目录操作的,很少自己去创建输入流和输出流,而应该尽量去使用Google 已经提供的方法。
    openFileOutput("info.txt", MODE_PRIVATE)方法的第二个参数是设置文件的权限,这里使用了私有常量值,也就是只能当前应用访问该文件。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.example.administrator.myapplication.MainActivity">
    
        <EditText
            android:id="@+id/et_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入用户名"/>
    
        <EditText
            android:id="@+id/et_pwd"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入密码"/>
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <CheckBox
                android:id="@+id/cb"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:text="记住密码"/>
    
            <Button
                android:onClick="login"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:text="登录"/>
        </RelativeLayout>
    
    </LinearLayout>
    
    
    package com.example.administrator.myapplication;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.Toast;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class MainActivity extends AppCompatActivity {
        private EditText mEt_name;
        private EditText mEt_pwd;
        private CheckBox mCb;
        private Button   mBt;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //初始化控件
            mEt_name = (EditText) findViewById(R.id.et_name);
            mEt_pwd = (EditText) findViewById(R.id.et_pwd);
            mCb = (CheckBox) findViewById(R.id.cb);
    
            //数据回显
            //getFilesDir() 方法是父类提供的方法,可以直接访问data/data/包名/files目录
            File file = new File(getFilesDir(), "info.txt");
            //如果文件存在,则回显数据
            if (file.exists()) {
                //openFileInput(String)是父类提供的方法,可以直接获取data目录下指定文件的输入流。
                try {
                    FileInputStream fis = openFileInput("info.txt");
                    //将文件输入流转化为缓存流。
                    BufferedReader bf = new BufferedReader(new InputStreamReader(fis));
                    //因为保存时数据只有一行,因此读取一次就可以了。
                    String readLine = bf.readLine();
                    bf.close();
    
                    //数据是用户名##密码形式存储的,因此需要根据##对字符串进行切割。
    
                    String[] split = readLine.split("##");
    
                    //给EditText控件设置数据
                    mEt_name.setText(split[0]);
                    mEt_pwd.setText(split[1]);
    
                    //让CheckBox变成勾选状态,默认不勾选。
                    mCb.setChecked(true);
    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
    
        }
    
        //给登录按钮绑定的点击事件
        public void login(View view) throws IOException {
    
            //获取用户名和密码
            String name = mEt_name.getText().toString().trim();
            String pwd = mEt_pwd.getText().toString().trim();
            //校验数据
            if (TextUtils.isEmpty(name) || TextUtils.isEmpty(pwd)) {
    
    
                Toast.makeText(this, "用户名或者密码不能为空!", Toast.LENGTH_SHORT).show();
    
                return;
    
            }
    
            //获取CheckBox的选中状态
            boolean checked = mCb.isChecked();
    
            //保存数据
            File file = new File(getFilesDir(), "info.txt");
    
            if (checked) {
    
                //openFileOutput()方法是父类提供的直接打开data目录中指定文件的输出流
                //输出地址:/data/data/包名/files/info.txt
    
                FileOutputStream fos = openFileOutput("info.txt", MODE_PRIVATE);
                fos.write((name + "##" + pwd).getBytes());
                fos.close();
            } else {
                //如果用户没有勾选CheckBox,则删除历史文件。
                if (file.exists()) {
                    boolean delete = file.delete();
                    if (delete) {
                        Toast.makeText(this, "删除成功!", Toast.LENGTH_SHORT).show();
    
                    } else {
                        Toast.makeText(this, "删除失败!", Toast.LENGTH_SHORT).show();
    
                    }
    
                } else {
                    Toast.makeText(this, "该文件不存在,不用删除!", Toast.LENGTH_SHORT).show();
                }
            }
    
        }
    
    }
    
    
    

    相关文章

      网友评论

          本文标题:存储数据到data目录中

          本文链接:https://www.haomeiwen.com/subject/kyxvsxtx.html