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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editText = (EditText) findViewById(R.id.edit);}@Overridepublic 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 blocke.printStackTrace();}finally{try{if(bufferedWriter!=null){bufferedWriter.close();//關閉檔案}}catch(Exception e){e.printStackTrace();}}}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();String inputText=editText.getText().toString();//擷取到文字框裡面的內容save(inputText);//儲存文字框中的資訊}}
在活動銷毀的時候調用onDestroy方法的時候調用save方法儲存文字框裡面的內容。運行程式,在文字框中輸入hello world,如:
然後按下back鍵關閉程式,這時我們輸入的內容就已經儲存到檔案中了。我們可以開啟ddms的file explorer來查看。在file explZ喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcmVy1tC9+Mjrtb0vZGF0YS9kYXRhL2NvbS5qYWNrLmZpbGVwZXJzaXN0ZW5jZXRlc3QvZmlsZXMvxL/CvM/Cw+ajrL/J0tS/tLW9yfqzycHLZGF0YWZpbGXOxLz+o6zI58/CzbyjujwvcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/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;@Overrideprotected 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();}}@Overridepublic 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 blocke.printStackTrace();}finally{try{if(bufferedWriter!=null){bufferedWriter.close();//關閉檔案}}catch(Exception e){e.printStackTrace();}}}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.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 blocke.printStackTrace();}finally{if(reader!=null){try {reader.close();//關閉讀取流} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}return content.toString();//返回字串}}
setSelection方法將輸入游標移動到文本的末尾位置以便於繼續輸入,然後彈出一句還原成功的提示。
TextUtils.isEmpty()方法可以一次性進行2種值的判斷,當傳入的字串等於null或等於Null 字元串的時候,這個方法都會返回true,從而使我們不需要單獨去判斷這兩種空值。
重新運行程式,效果如下:
檔案儲存體不適合用來儲存一些比較複雜的資料,更複雜的資料的儲存方法,我將在後面就行總結。
轉載請註明來至:http://blog.csdn.net/j903829182/article/details/40924441