积土而为山,积水而为海。——《荀子·儒效》
本讲内容:File文件存储
Context类中提供了一个openFileOutput()方法用于将数据存储到指定的文件中,这个方法接收两个参数,第一个参数是文件名,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存到/data/data/<packagename>/files/目录下的。第二个参数是文件的操作模式,主要有两种模式可选,MODE_PRIVATE和MODE_APPEND。其中MODE_PRIVATE是默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容,而MODE_APPEND则表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件。
openFileOutput()方法返回的是一个FileOutputStream对象,得到这个对象之后就可以使用Java流的方式将数据写入到文件夹中了。
示例一:将一段文本内容保存到文件中
然后按下Back键关闭程序,这时我们输入的内容就已经保存到文件中了,打开DDMS的File Explorer来查看一下。可以看到生成了一个data文件。
用记事本打开这个文件
下面是res/layout/activity_main.xml 布局文件:
<RelativeLayout 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" >
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Type something here" />
</RelativeLayout>
下面是MainActivity.java主界面文件:
public class MainActivity extends Activity {
private EditText edit;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit=(EditText) findViewById(R.id.edit);
}
//活动销毁之前一定会调用这个方法保存数据
protected void onDestroy() {
super.onDestroy();
String inputText=edit.getText().toString();
save(inputText);
}
//将文本内容保存到文件的方法
private void save(String inputText) {
FileOutputStream out=null;
BufferedWriter writer=null;
try {
out=openFileOutput("data", Context.MODE_APPEND);
writer=new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(writer!=null){
writer.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
示例二:从文件中读取数据
Context类中还提供了一个openFileInput()方法用于从文件中读取数据。它只接收一个参数,即要读取的文件名,然后系统自动到/data/data/<packagename>/files/目录下去加载这个文件,并返回一个FileInputStream对象,得到这个对象之后再通过Java流的方式就可以将数据读取出来了。
譬如在EditText中输入Hello world,接着按下Back键退出程序,再重新启动程序,这时刚才输入的内容并不会丢失,而是还原到EditText中。
下面是MainActivity.java主界面文件:
public class MainActivity extends Activity {
private EditText edit;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit=(EditText) findViewById(R.id.edit);
String inputText=load();
//对字符串进行非空判断使用TextUtils.isEmpty()方法,它可以一次性进行两种空值的判断,当传入的字符串等于null或者等于空字符串时
//这个方法都会返回true
if(!TextUtils.isEmpty(inputText)){
edit.setText(inputText);
//setSelection()方法将输入光标移动到文本的末尾位置以便于继续输入
edit.setSelection(inputText.length());
Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_LONG).show();
}
}
//从文件中读取数据
public String load(){
FileInputStream in=null;
BufferedReader reader=null;
//把文件中所有的文本内容全部读取出来并存放在一个StringBuilder对象中
StringBuilder content=new StringBuilder();
try {
in=openFileInput("data");
reader=new BufferedReader(new InputStreamReader(in));
String line="";
while((line=reader.readLine())!=null){
content.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(reader!=null){
try {
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return content.toString();
}
}
Take your time and enjoy it 要原码的、路过的、学习过的请留个言,顶个呗~~