android学习十(android的文件存储)

???在android系统中主要提供了三种方式用于简单的实现数据持久化功能,即文件存储,SharePreference存储以及数据库存储。当然还可以把数据保存到SD卡中。

? 文件存储是android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式话处理,所有数据都是原封不动地保存到文件当中的,因而比较适合用于存储一些简单的文本数据或二进制数据。

? ? ?Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。这个方法接收两个参数,第一个参数是文件的名,在创建文件的时候使用的就是这个名称,注意这里指定的文件名不包含路径,因为所有的文件都是默认存储到/data/data/<package>/files/目录下的。第二个参数是文件的操作模式,主要有2种模式可选,MODE_PRIVATE和MODE_APPEND.其中MODE_PRIVATE是默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容,而MODE_APPEND则表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件。

? ? ?openFileOutput()方法返回的是一个FileOutputStream对象,得到这个对象之后就可以使用java流的方式将数据写入到文件中了。

?

?

把数据保存到文件中

?

创建一个android项目,项目名为FilePersistenceTest,并修改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"
     >

   <EditText 
       android:id="@+id/edit"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:hint="type something here"
       />

</LinearLayout>

?下面我们要做的是,在活动销毁的时候,保存数据,把数据保存到文件当中。修改MainActivity中的代码:

?

?

package com.jack.filepersistencetest;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.widget.EditText;

public class MainActivity extends Activity {

	private EditText editText;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		editText = (EditText) findViewById(R.id.edit);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	public void save(String inputText){
		FileOutputStream fileOutputStream=null;//文件输出流对象
		BufferedWriter bufferedWriter=null;//字符缓冲流对象
		try {
			//初始化文件输出流对象
			fileOutputStream=openFileOutput("datafile", Context.MODE_PRIVATE);
			//初始化字符缓冲流对象
			bufferedWriter=new BufferedWriter(new OutputStreamWriter(fileOutputStream));
			//向缓冲内存中写入字符串
			bufferedWriter.write(inputText);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try{
				if(bufferedWriter!=null){
					bufferedWriter.close();//关闭文件
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		String inputText=editText.getText().toString();//获取到文本框里面的内容
		save(inputText);//保存文本框中的信息
	}
	
	
	
	
}

?在活动销毁的时候调用onDestroy方法的时候调用save方法保存文本框里面的内容。运行程序,在文本框中输入hello world,如下图:

?


?

然后按下back键关闭程序,这时我们输入的内容就已经保存到文件中了。我们可以打开ddms的file explorer来查看。在file explorer中进入到/data/data/com.jack.filepersistencetest/files/目录下面,可以看到生成了datafile文件,如下图:


?

?

然后点击上图中右边最左边的按钮将文件导出到电脑上,然后用文本编辑器打开文件,可以看到里面的内容如下:

可以证实文本框里面的内容确实已经保存到文件中了。

?

?

从文件中读取数据

? ? 类似将数据存储到文件中Context类中还提供了一个openFileInput方法,用于从文件中读取数据。这个方法比较简单,只接收一个参数,即要读取的文件名,然后系统会自动到/data/data/<package>/files/目录下加载这个文件,并返回一个FileInputStream对象,得到了这个对象之后再通过java流的方式就可以将数据读取出来了。

修改MainActivity中的代码,修改如下所示:

?

package com.jack.filepersistencetest;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.text.TextUtils;
import android.view.Menu;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

	private EditText editText;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		editText = (EditText) findViewById(R.id.edit);
		
		String inputText=load();
		if(!TextUtils.isEmpty(inputText)){
			editText.setText(inputText);
			editText.setSelection(inputText.length());
			Toast.makeText(this, "Restoring succeeded",
					Toast.LENGTH_SHORT).show();
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	public void save(String inputText){
		FileOutputStream fileOutputStream=null;//文件输出流对象
		BufferedWriter bufferedWriter=null;//字符缓冲流对象
		try {
			//初始化文件输出流对象
			fileOutputStream=openFileOutput("datafile", Context.MODE_PRIVATE);
			//初始化字符缓冲流对象
			bufferedWriter=new BufferedWriter(new OutputStreamWriter(fileOutputStream));
			//向缓冲内存中写入字符串
			bufferedWriter.write(inputText);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try{
				if(bufferedWriter!=null){
					bufferedWriter.close();//关闭文件
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		String inputText=editText.getText().toString();//获取到文本框里面的内容
		save(inputText);//保存文本框中的信息
	}
	
	
	public String load(){
		FileInputStream in=null;//文件输入流
		BufferedReader reader=null;//字符缓冲流
		StringBuffer content=new StringBuffer();//StringBuffer对象
		try {
			in=openFileInput("datafile");//获得文件输入流
			reader=new BufferedReader(new InputStreamReader(in));//获得缓冲对象
			String line="";//
			while((line=reader.readLine())!=null){//读取一行内容
				content.append(line);//把读取的内容添加到content
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(reader!=null){
				try {
					reader.close();//关闭读取流
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		return content.toString();//返回字符串
		
	}
	
}

?setSelection方法将输入光标移动到文本的末尾位置以便于继续输入,然后弹出一句还原成功的提示。

?

?

TextUtils.isEmpty()方法可以一次性进行2种值的判断,当传入的字符串等于null或等于空字符串的时候,这个方法都会返回true,从而使我们不需要单独去判断这两种空值。

重新运行程序,效果如下:


?

?

文件存储不适合用来保存一些比较复杂的数据,更复杂的数据的保存方法,我将在后面就行总结。

?

?

欢迎大家访问我的个人网站 萌萌的IT人

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