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

存储数据到data目录中

作者: 码字与律动 | 来源:发表于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