(九)android 中数据存储与访问——保存文件到手机内存

9.1手机的存储区域

手机的存储区域通常有两个地方:一:手机内部存储空间,理解成一块微硬盘/data/data/;二:外部存储空间SD卡

9.2方法捕获异常的原则

如果方法有返回值,则用try catch捕获,如果方法的返回值是Void类型,则使用throws抛出异常

9.3 上下文Context

Context:是一个类,提供一些方便的api 可以得到应用程序的环境,例如:环境的包名,安装路径,资源路径,资产的路径

9.4 保存文件到手机内存——登陆界面例子程序

9.4.1 项目需求

用户登陆界面如下所示,当勾选保存密码时,则将用户名和密码保存到手机内存上,当下次打开登陆界面时,将自动从手机内存中取出用户名和密码回显在界面上。

9.4.2 工程目录结构如下所示

9.4.3 activity_main.xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.logintest.MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="请输入用戶名"
        android:textSize="18dp" />

    <EditText
        android:id="@+id/et_username"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="18dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="请输入密碼"
        android:textSize="18dp" />

    <EditText
        android:id="@+id/et_pwd"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="numberPassword"
        android:textSize="18dp" />

    <RadioGroup
        android:id="@+id/rg_mode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <RadioButton
            android:id="@+id/rb_private"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="私有的" />

        <RadioButton
            android:id="@+id/rb_public"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="公有的" />

        <RadioButton
            android:id="@+id/rb_readable"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="可读的" />
    </RadioGroup>

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <CheckBox
            android:id="@+id/cb_checked"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="记住密码"
            android:textSize="18dp" />

        <Button
            android:id="@+id/bt_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="登陆"
            android:textSize="18dp" />
    </RelativeLayout>
   
</LinearLayout>

9.4.4 FileInfo.java文件

package com.example.logintest.service;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import android.content.Context;

public class FileInfo {
    /**
     * 保存文件到context.getFilesDir()中
     * 
     * @param context
     *            上下文
     * @param username
     *            用戶名
     * @param Pwd
     *            用戶密碼
     * @return
     */
    public static boolean saveFileUserInfo(Context context, String username,
            String Pwd) {
        File file = new File(context.getFilesDir(), "userinfo.txt");
        // context.openFileOutput(file, mode)
        try {
            FileOutputStream fos = new FileOutputStream(file);
            // fos.write(username+"##"+Pwd).getB;
            fos.write((username + "##" + Pwd).getBytes());
            fos.close();
            return true;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }

    }

    /**
     * 从文件中读取用户的信息,并保存在Map对象中 從context.getFilesDir()中获得文件目录
     * 
     * @param context
     * @return
     */
    public static Map<String, String> getUserInfo(Context context) {
        File file = new File(context.getFilesDir(), "userinfo.txt");

        FileInputStream fis;
        try {
            fis = new FileInputStream(file);

            BufferedReader br = new BufferedReader(new InputStreamReader(fis));

            String str = br.readLine();
            String infos[] = str.split("##");
            Map<String, String> map = new HashMap<String, String>();
            map.put("username", infos[0]);
            map.put("userpwd", infos[1]);
            return map;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }

    }
}

9.4.5 MainActivity.java文件

package com.example.logintest;

import java.util.Map;

import com.example.logintest.service.FileInfo;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
    private static final String TAG = "MainActivity";
    private EditText et_username;
    private EditText et_pwd;
    private CheckBox cb_checked;
    private Button bt_login;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_username = (EditText) this.findViewById(R.id.et_username);
        et_pwd = (EditText) this.findViewById(R.id.et_pwd);
        cb_checked = (CheckBox) this.findViewById(R.id.cb_checked);
        bt_login = (Button) this.findViewById(R.id.bt_login);
        bt_login.setOnClickListener(this);

        Map<String, String> map = FileInfo.getUserInfo(this);
        if (map != null) {
            et_username.setText(map.get("username"));
            et_pwd.setText(map.get("userpwd"));
        }
    }

    @SuppressLint("ShowToast")
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        String userName = et_username.getText().toString().trim();
        String userPwd = et_pwd.getText().toString().trim();
        if (TextUtils.isEmpty(userName) || TextUtils.isEmpty(userPwd)) {
            Toast.makeText(this, "用户名为空或用户密码为空", 1).show();
        } else {
            if (cb_checked.isChecked()) {
                Log.i(TAG, "请保存密码");
                if (FileInfo.saveFileUserInfo(this, userName, userPwd)) {
                    Log.i(TAG, "用戶信息保存成功");
                }
            }
            if ("zhangsan".equals(userName) && "123".equals(userPwd)) {
                Toast.makeText(this, "用户登陆", 1).show();
            } else {
                Toast.makeText(this, "登陆失敗", 1).show();
            }
        }
    }

}

9.4.6 程序运行界面如下所示

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。