文件 Android中对文件的操作和Java是一样的。
Android系统中存储系统分为内部存储和外部存储两种
内部存储空间
RAM内存:运行内存,相当于电脑的内存。
ROM内存:存储内存,相当于电脑的硬盘
在ROM内存中写写数据不需要权限
在Android中,组件之间不能相互转换EditText不能转换成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;
private String name ="";
private 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()) {
//内部存储空间的路径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_REMOVED:sdcard不存在 MEDIA_UNKNOWN:不能识别sdcard
* MEDIA_UNMOUNTED:sd存在但是没有挂载上 MEDIA_MOUNTED :sdcard已经挂载,可正常使用
* MEDIA_MOUNTED_READ_ONLY: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]);
}
}
}
}