android學習十(android的文件存儲)

在android系統中主要提供瞭三種方式用於簡單的實現數據持久化功能,即文件存儲,SharePreference存儲以及數據庫存儲。當然還可以把數據保存到SD卡中。

文件存儲是android中最基本的一種數據存儲方式,它不對存儲的內容進行任何的格式話處理,所有數據都是原封不動地保存到文件當中的,因而比較適合用於存儲一些簡單的文本數據或二進制數據。

Context類中提供瞭一個openFileOutput()方法,可以用於將數據存儲到指定的文件中。這個方法接收兩個參數,第一個參數是文件的名,在創建文件的時候使用的就是這個名稱,註意這裡指定的文件名不包含路徑,因為所有的文件都是默認存儲到/data/data//files/目錄下的。第二個參數是文件的操作模式,主要有2種模式可選,MODE_PRIVATE和MODE_APPEND.其中MODE_PRIVATE是默認的操作模式,表示當指定同樣文件名的時候,所寫入的內容將會覆蓋原文件中的內容,而MODE_APPEND則表示如果該文件已存在就往文件裡面追加內容,不存在就創建新文件。

openFileOutput()方法返回的是一個FileOutputStream對象,得到這個對象之後就可以使用java流的方式將數據寫入到文件中瞭。

把數據保存到文件中

創建一個android項目,項目名為FilePersistenceTest,並修改activity_main.xml中的代碼,代碼如下所示:


   


下面我們要做的是,在活動銷毀的時候,保存數據,把數據保存到文件當中。修改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 explZ喎?/kf/ware/vc/” target=”_blank” class=”keylink”>vcmVy1tC9+Mjrtb0vZGF0YS9kYXRhL2NvbS5qYWNrLmZpbGVwZXJzaXN0ZW5jZXRlc3QvZmlsZXMvxL/CvM/Cw+ajrL/J0tS/tLW9yfqzycHLZGF0YWZpbGXOxLz+o6zI58/CzbyjujwvcD4KPHA+PGltZyBzcmM9″/uploadfile/Collfiles/20141110/2014111008354910.jpg” alt=”\”>

然後點擊上圖中右邊最左邊的按鈕將文件導出到電腦上,然後用文本編輯器打開文件,可以看到裡面的內容如下:

可以證實文本框裡面的內容確實已經保存到文件中瞭。

從文件中讀取數據

類似將數據存儲到文件中Context類中還提供瞭一個openFileInput方法,用於從文件中讀取數據。這個方法比較簡單,隻接收一個參數,即要讀取的文件名,然後系統會自動到/data/data//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,從而使我們不需要單獨去判斷這兩種空值。

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

文件存儲不適合用來保存一些比較復雜的數據,更復雜的數據的保存方法,我將在後面就行總結。

轉載請註明來至:https://blog.csdn.net/j903829182/article/details/40924441

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。