Android数据存储之文件

文件  Android中对文件的操作和Java是一样的。
Android系统中存储系统分为内部存储和外部存储两种

       内部存储空间

RAM内存:运行内存,相当于电脑的内存。

ROM内存:存储内存,相当于电脑的硬盘

ROM内存中写写数据不需要权限

Android中,组件之间不能相互转换TditText不能转换成EditText

案例记住登录用户名和密码:

<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"

   >

    <EditText

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/name"

        android:hint="请输入用户名:" />

<EditText

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/password"

        android:password="true"

        android:hint="请输入密码:" />

<RelativeLayout

    android:layout_width="fill_parent"

    android:layout_height="match_parent"

  >

    <Button

        android:id="@+id/login"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_alignParentRight="true"

        android:text="登录" 

        android:onClick="login"/>

    <CheckBox

        android:id="@+id/check"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_alignBaseline="@+id/login"

        android:layout_alignBottom="@+id/login"

        android:layout_centerVertical="true"

        android:text="记住用户名" />

 

</RelativeLayout>

</LinearLayout>

package com.test.storage;

 

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.CheckBox;

import android.widget.EditText;

import android.widget.Toast;

public class MainActivity extends Activity {

    private EditText et_name = null;

    private EditText et_password = null;

   privateString name ="";

   privateString password="";

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        //全局变量的初始化,最好放在onCreate方法中

        //不要提前获取组件的值,有可能会导致下一次使用时值改变或者为空

        /*et_name = (EditText) this.findViewById(R.id.name);

         et_password = (EditText) this.findViewById(R.id.password);

         name = et_name.getText().toString().trim();

         password = et_password.getText().toString().trim();*/

        et_name = (EditTextthis.findViewById(R.id.name);

        et_password = (EditTextthis.findViewById(R.id.password);

        try {

            readInfo();

            } catch (IOException e) {

            // TODO Auto-generated catch block

        e.printStackTrace();

    }

}

public void login(View v) throws IOException{

     name = et_name.getText().toString().trim();

     password = et_password.getText().toString().trim();

    CheckBox cb = (CheckBoxthis.findViewById(R.id.check);

    //判断checkbox是否被选中

    if (cb.isChecked()) {

    //内部存储空间的路径data/data/包名  在RAM

    //最好通过上下文Context可以获取上下文的环境信息,getFilesDir():/data/data/当前包名.apirwinfrom/files/文件名

    //File file = new File(getFilesDir(), "userinfo.txt");

    //这种方式不好,当包名一旦改变,就会报异常。

       File file = new File("data/data/com.test.storage/info.txt");

        if (!file.exists()) {

            file.createNewFile();

        }

      FileOutputStream fos = new FileOutputStream(file);

        fos.write((name+" "+password).getBytes());

        fos.flush();

        fos.close();

    }

    //创建弹出对话框,参数:上下文内容  文本内容  显示时间

    Toast.makeText(this"登录成功",Toast.LENGTH_SHORT).show();

}

public void readInfo() throws IOException{

    File file = new File("data/data/com.test.storage/info.txt");

    if(file.exists()){

        FileInputStream fis = new FileInputStream(file);

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

        String line = null;

        line = br.readLine();

        String[] userInfo = line.split(" ");

        et_name.setText(userInfo[0]);

        et_password.setText(userInfo[1]);

    }

    }

}

 

当手机内部存储空间不足时,Cache中文件会被删除。重要的信息不要保存在Cache中。网络中的照片可以保存在Cache中。

清空缓存是清空Cache文件夹下的所有内容。

清空数据是清空应用程序独立空间下的所有内容,包括缓存。

 

 

外部存储空间

sdcard:相当于电脑的移动硬盘

sdcard的位置:

Android2.3之前,sdcard路径:在根目录下sdcard文件夹

Android4.3版本之前,sdcard路径:mnt/sdcard

Android4.3开始,sdcard路径:storage/sdcard

为了兼容低版本的程序,Android在之前各个版本的sdcard目录下都留下了快捷方式,指向storage/sdcard

在外部存储空间写文件,需要添加权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 在sdcard中读数据不需要权限。

如果用户选择了保护sdcard的选项,则读取sdcard的文件上的数据,也是要权限的。

android.permission.READ_EXTERNAL_STORAGE

 

package com.test.storage;

 

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

 

import android.app.Activity;

import android.os.Bundle;

import android.os.Environment;

import android.view.View;

import android.widget.CheckBox;

import android.widget.EditText;

import android.widget.Toast;

 

public class MainActivity extends Activity {

    private EditText et_name = null;

    private EditText et_password = null;

    String name = "";

    String password = "";

 

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

// 全局变量的初始化,最好放在onCreate方法中

// 不要提前获取组件的值,有可能会导致下一次使用时值改变或者为空

/*

 * et_name = (EditText) this.findViewById(R.id.name); et_password =

 * (EditText) this.findViewById(R.id.password); name =

 * et_name.getText().toString().trim(); password =

 * et_password.getText().toString().trim();

 */

    et_name = (EditTextthis.findViewById(R.id.name);

    et_password = (EditTextthis.findViewById(R.id.password);

    try {

        readInfo();

catch (IOException e) {

// TODO Auto-generated catch block

    e.printStackTrace();

    }

}

 

public void login(View v) throws IOException {

    name = et_name.getText().toString().trim();

    password = et_password.getText().toString().trim();

    CheckBox cb = (CheckBoxthis.findViewById(R.id.check);

// 判断checkbox是否被选中

    if (cb.isChecked()) {

 

// 这种方式不好,当包名一旦改变,就会报异常。

// File file = new File("sdcard/info.txt");

// 使用sdcard之前必须要检测sdcard的状态

/**

 * MEDIA_REMOVED:sdcard不存在 MEDIA_UNKNOWN:不能识别sdcard

 * MEDIA_UNMOUNTEDsd存在但是没有挂载上 MEDIA_MOUNTED :sdcard已经挂载,可正常使用

 * MEDIA_MOUNTED_READ_ONLY:sdcard只读 MEDIA_CHECKINGsdcard正在准备

 */

    if (Environment.getExternalStorageState().equals(

    Environment.MEDIA_MOUNTED)) {

// 最好通过上下文Context可以获取上下文的环境信息,返回的是sdcard的真实路径

    File file = new File(Environment.getExternalStorageDirectory(),

"userinfo.txt");

    if (!file.exists()) {

        file.createNewFile();

    }

    FileOutputStream fos = new FileOutputStream(file);

    fos.write((name + " " + password).getBytes());

    fos.flush();

    fos.close();

 

}

else {

    Toast.makeText(this"sdcard不可以用"Toast.LENGTH_SHORT);

}

// 创建弹出对话框,参数:上下文内容 文本内容 显示时间

Toast.makeText(this"登录成功"Toast.LENGTH_SHORT).show();

 

}

 

public void readInfo() throws IOException {

// File file = new File("sdcard/info.txt");

    if (Environment.getExternalStorageState().equals(

        Environment.MEDIA_MOUNTED)) {

        File file = new File(Environment.getExternalStorageDirectory(),

        "userinfo.txt");

        if (file.exists()) {

            FileInputStream fis = new FileInputStream(file);

            BufferedReader br = new BufferedReader(new InputStreamReader(

fis));

            String line = null;

            line = br.readLine();

            String[] userInfo = line.split(" ");

            et_name.setText(userInfo[0]);

            et_password.setText(userInfo[1]);

            }

        }

        }

}

发布了70 篇原创文章 · 获赞 4 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章