数据存储之文件存储——第一行代码Android学习笔记

一、 Android数据存储

Android 系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储、 SharedPreference 存储以及数据库存储。当然,除了这三种方式之外,你还可以将数据保存在手机的 SD 卡中。

二、 文件存储

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

1.  将数据存储到文件中
openFileOutput()方法,可以用于将数据存储到指定的文件中。接收两个参数:
第一个参数是文件名所有的文件都是默认存储到/data/data/<packagename>/files/目录下的。
第二个参数是文件的操作模式,主 要 有 两 种 模 式 可 选 ,MODE_PRIVATE 和 MODE_APPEND。 其中 MODE_PRIVATE 是默认的操作模式, 表示当指定同样文件名的时候, 所写入的内容将会覆盖原文件中的内容, 而 MODE_APPEND 则表示如果该文件已存在就往文件里面追加内容, 不存在就创建新文件。
例子:
activity_main.xml中,在布局中加入了一个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" >

    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:hint="请输入"/>
</LinearLayout>
MainActivity中:
<span style="font-weight: normal;">package com.example.filepersistencetest;

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

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


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

    @Override
    protected void onDestroy() {
    	// TODO Auto-generated method stub
    	super.onDestroy();
    	String inputText=edit.getText().toString();
    	save(inputText);
    }
    
    public void save(String inputText){
    	FileOutputStream out = null;
    	BufferedWriter writer = null;
    	try{
    		out=openFileOutput("data", Context.MODE_PRIVATE);
    		writer= new BufferedWriter(new OutputStreamWriter(out));
    		writer.write(inputText);
    	}catch(IOException e){
    		e.printStackTrace();
    	}finally{
    		try{
    			if(writer!=null){
    				writer.close();
    			}
    		}catch(IOException e){
    			e.printStackTrace();
    		}
    	}
    }
    @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;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}</span>
首先我们在 onCreate()方法中获取了EditText的实例, 然后重写了onDestroy()方法, 这样就可以保证在活动销毁之前一定会调用这个方法。 在onDestroy()方法中我们获取EditText中输入的内容, 并调用save()方法把输入的内容存储到文件中, 文件命名为data
save()里通过openFileOutput()方法能够得到一个 FileOutputStream 对象,然后再借助它构建出一 个OutputStreamWriter对象,接着再使用 OutputStreamWriter 构建出一个 BufferedWriter 对象,这样你就可以通过BufferedWriter 来将文本内容写入到文件中了。

切换DDMS视图,并点击FileExplorer切换卡 , 在 这 里 进 入 到 /data/data/com.example.filepersistencetest/files/目录下,可以看到生成了一个data文件。
2从文件中读取数据
openFileInput()方法, 用于从文件中读取数据。它只接收一个参数,即要读取的文件名,然后系统会自动到/data/data/<package name>/files/目录下去加载这个文件,并返回一个FileInputStream对象。
例子:启动程序时 EditText中能够保留我们上次输入的内容。
<span style="font-weight: normal;">    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edit=(EditText)findViewById(R.id.edit);
        String inputText=load();
        if(!TextUtils.isEmpty(inputText)){
        	edit.setText(inputText);
        	edit.setSelection(inputText.length());
        	Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show();
        }
    }</span>

<span style="font-weight: normal;">    public String load() {
    	FileInputStream in = null;
    	BufferedReader reader = null;
    	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 (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			if(reader!=null){
				try {
					reader.close();
				} catch (IOException e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
		}
    	return content.toString();
    }</span>
onCreate()方法中调用 load()方法来读取文件中存储的文本内容, 如果读到的内容不为空, 就调用EditText setText()方法将内容填充到EditText里,并调用setSelection 方法将输入光标移动到文本的末尾位置以便于继续输入,然后弹出 一句还原成功的提示。 
load()方法中
首先通过openFileInput()方法获取到了一个FileInputStream对象,然后借助它又构建出了一个InputStreamReader对象,接着再使用InputStreamReader构建出一个BufferedReader对象,这样我们就可以通过BufferedReader进行一行行地读取,把文件中所有的文本内容全部读取出来并存放在一个 StringBuilder 对象中。

你可能感兴趣的:(数据库,android,移动,数据存储,StringBuilder)