Android开发—数据存储之“文件存储”

一、文件存储简介:

文件存储是Android中最基本的一种数据存储方式,它与Java中的
文件存储类似,都是通过I/O流的形式把数据存储到文档中。

Android中的文件存储分为内部存储和外部存储。
在这里插入图片描述

二、内部存储—写入:

打开打开应用程序中对应的输出 流将数据存储到指定的文件 中关闭输出流:

fos = openFileOutput(fileName, MODE_PRIVATE); 
fos.write(content.getBytes()); 
fos.close();

写入/读入的四种模式:
在这里插入图片描述

三、内部存储—读取:

打开应用程序中对应的输入流创建缓冲区并获取文件长度将文件内容读取到buffer缓冲区中将读取到的内容转换成指定字符串关闭输入流:

fis = openFileInput("data.txt"); 
byte[] buffer = new byte[fis.available()]; 
fis.read(buffer); 
content = new String(buffer); 
fis.close();

四、实战练习:

使用内部文件存储的方式保存数据,以实现保存QQ密码功能。

由于读取/存储文件代码大部分是固定的代码(模板代码),因此可将之进行封装成一个单独类,将可变部分暴露为参数方式,以便代码重用。
➢ 设计思路:
由于要保存密码,所以应该有一个保存方法,方法设计时首选static,除非它不能满足需求,因为static可不需要实例化而直接调用; 保存密码可以给用户一个反馈,成功或失败,因此可设计为boolean.

【目录结构】:

在这里插入图片描述

【SaveQQTools.java】:
package com.example.filestore;
import android.content.Context;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;

public class SaveQQTools {
    //用户保存的文件名,封装起来,避免给调用者带来负担,
    // 也避免了写入/读入不一致导致的失败
    final static String fileName="data.txt";
    public static boolean saveUserInfo(Context context, //用户上下文
                                       String number, //用户的账号
                                       String password) {//用户的密码
        try {
            FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
//       账号和密码间采用的是【:】,这就是一个简单的【文件格式】!
//       不论多么复杂的文件格式,如【bmp】,都有自己的一套标准
            fos.write((number + ":" + password).getBytes());
            fos.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false; } }



    //由于获取的是QQ账号和密码,因此应该用一个数据结构存下来,如HashMap
    public static Map<String, String> getUserInfo(Context context) {
        String content = "";
        try {
            FileInputStream fis = context.openFileInput("data.txt");
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            content = new String(buffer);
            Map<String, String> userMap = new HashMap<String, String>();
//    根据文件格式解析数据内容
            String[] infos = content.split(":");
//    存入数据结构中
            userMap.put("number", infos[0]);
            userMap.put("password", infos[1]);
            fis.close();
            return userMap;
        } catch (Exception e) {
            e.printStackTrace();
            return null; } }

}

【MainActivity.java】:
package com.example.filestore;
        import android.support.v7.app.AppCompatActivity;
        import java.util.Map;
        import android.os.Bundle;
        import android.text.TextUtils;
        import android.view.View;
        import android.widget.Button;
        import android.widget.EditText;
        import android.widget.Toast;
        import java.util.Map;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
        private EditText etNumber;
        private EditText etPassword;
        private Button btnLogin;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
//初始化界面
            initView();
            Map<String, String> userInfo = SaveQQTools.getUserInfo(this);
            if (userInfo != null) {
                etNumber.setText(userInfo.get("number"));
                etPassword.setText(userInfo.get("password"));
            } }
        private void initView() {
            etNumber = (EditText) findViewById(R.id.et_number);
            etPassword = (EditText) findViewById(R.id.et_password);
            btnLogin = (Button) findViewById(R.id.btn_login);
//设置按钮的点击事件
            btnLogin .setOnClickListener(this);
        }
        @Override
        public void onClick(View v) {
//当单击“登录”按钮时,获取QQ账号和密码
            String number = etNumber.getText().toString().trim();
            String password = etPassword.getText().toString();
//检验账号和密码是否正确
            if (TextUtils.isEmpty(number)) {
                Toast.makeText(this, "请输入Q Q账号", Toast.LENGTH_SHORT).show();
                return; }
            if (TextUtils.isEmpty(password)) {
                Toast.makeText(this, "请输入密码", Toast.LENGTH_SHORT).show();
                return; }
//登录成功
            Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
//保存用户信息
            boolean isSaveSuccess = SaveQQTools.saveUserInfo(this, number, password);
            if (isSaveSuccess) {
                Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show();
            } }
}

【activity_main.xml】:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#E6E6E6"
    android:orientation="vertical">

    <ImageView
    android:id="@+id/iv"
    android:layout_width="70dp"
    android:layout_height="70dp"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:background="@drawable/head"/>

    <LinearLayout
        android:id="@+id/ll_number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/iv"
        android:layout_centerVertical="true"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="15dp"
        android:background="#ffffff">
        <TextView
        android:id="@+id/tv_number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="账号:"
        android:textColor="#000"
        android:textSize="20sp"/>
        <EditText
            android:id="@+id/et_number"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:background="@null"
            android:padding="10dp"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/ll_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/ll_number"
        android:layout_centerVertical="true"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:background="#ffffff">

        <TextView
        android:id="@+id/tv_password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="密码:"
        android:textColor="#000"
        android:textSize="20sp"/>
        <EditText
            android:id="@+id/et_password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_toRightOf="@id/tv_password"
            android:background="@null"
            android:inputType="textPassword"
            android:padding="10dp"/>
    </LinearLayout>

    <Button
        android:id="@+id/btn_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/ll_password"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="50dp"
        android:background="#3C8DC4"
        android:text="登录"
        android:textColor="#ffffff"
        android:textSize="20sp"/>
</RelativeLayout>
【Head.png】(QQ头像的图片):

在这里插入图片描述

【运行结果】:

输入用户名、密码,点击登录。提示登录成功!
在这里插入图片描述
下面看用户名,密码怎么以文件形式存储的:
低版本打开Device File Explore 如下:(高版本可百度)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
把data.txt导出来,可以看到:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雄不是大熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值