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();
}
}
}
}
网友评论