文件  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 = (EditText) this.findViewById(R.id.name);
        et_password = (EditText) this.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 = (CheckBox) this.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 = (EditText) this.findViewById(R.id.name);
    et_password = (EditText) this.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 = (CheckBox) this.findViewById(R.id.check);
// 判断checkbox是否被选中
    if (cb.isChecked()) {
 
// 这种方式不好,当包名一旦改变,就会报异常。
// File file = new File("sdcard/info.txt");
// 使用sdcard之前必须要检测sdcard的状态
/**
不存在 MEDIA_UNKNOWN:不能识别sdcard
:sd存在但是没有挂载上 MEDIA_MOUNTED :sdcard已经挂载,可正常使用
只读 MEDIA_CHECKING:sdcard正在准备
 */
    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]);
            }
        }
        }
}