在Android中一共提供了5種數據存儲方式,分別爲:html
(1)Files:經過FileInputStream和FileOutputStream對文件進行操做。java
(2)Shared Preferences:經常使用來存儲鍵值對形式的數據,對系統配置信息進行保存。android
(3)Content Providers:數據共享,用於應用程序之間數據的訪問。數據庫
(4)SQLite:Android自帶的輕量級關係型數據庫,支持SQL語言,用來存儲大量的數據,而且可以對數據進行使用、更新、維護等操做。緩存
(5)Network:經過網絡來存儲和獲取數據。網絡
本文主要介紹第一種方式,經過文件存儲數據。ide
在Android中,所建立的用於保存數據的文件能夠位於兩個位置:設備自己的存儲空間中,或是外接的存儲設備中(SD卡)。不管存儲在哪一個位置,在默認的狀況下,該文件都是不可以供不一樣的應用程序共享的。單元測試
下面分別介紹如何將文件存儲在設備自己的存儲空間中以及外接的存儲設備中。測試
1.將文件存儲在設備自己的存儲空間中this
在Android中,可使用Context類提供的如下兩個方法來實現文件存儲。
(1)public abstract FileInputStream openFileInput(String name);//打開文件輸入流
(2)public abstract FileOutStream openFileOutput(String name, int mode);//打開文件輸出流
其中,openFileInput()方法表示打開文件輸入流,用於從文件中讀取數據;openFileOutput()方法表示打開文件輸出流,用於向文件中寫入內容。
此外,openFileOutput()方法中的第二個參數mode用於指定文件的操做模式,其可選值有如下4種:
(1)Context.MODE_APPEND;//內容追加模式。在該模式下,系統會檢查文件是否存在,若是存在,則將內容追加到文件的末尾,若是文件不存在,則建立該文件並寫入內容。
(2)Context.MODE_PRIVATE;//默認操做模式。在該模式下,文件做爲私有數據,只能被該應用程序自己訪問。而且,在該模式下,寫入的內容會覆蓋原文件的內容。
(3)Context.MODE_WORLD_READABLE;//可讀模式。在該模式下,別的應用程序能夠讀取該文件內容。
(4)Context.MODE_WORLD_WRITEABLE;//可寫模式。在該模式下,別的應用程序能夠將內容寫入該文件。
package com.leaf.android; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import android.R.bool; import android.R.integer; import android.content.Context; import android.os.Environment; public class FileService { private Context context; public FileService(Context context) { this.context = context; } public FileService() { } public String getFileFromSdcard(String filename) { FileInputStream inputStream = null; // 緩存的流,與磁盤無關,不須要關閉 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); File file = new File(Environment.getExternalStorageDirectory(), filename); if (Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState())) { try { inputStream = new FileInputStream(file); int len = 0; byte[] data = new byte[1024]; try { while ((len = inputStream.read(data)) != -1) { outputStream.write(data, 0, len); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } return new String(outputStream.toByteArray()); } /** * * @param filename 文件的名稱 * @param content 文件的內容 * @return */ public boolean saveContentToSdcard(String filename, String content) { boolean flag = false; FileOutputStream fileOutputStream = null; // 得到sdcard所在的路徑 File file = new File(Environment.getExternalStorageDirectory(), filename); // 判斷sdcard是否可用 if (Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState())) { try { fileOutputStream = new FileOutputStream(file); fileOutputStream.write(content.getBytes()); flag = true; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } return flag; } }
單元測試類:
package com.leaf.android; import android.content.Context; import android.test.AndroidTestCase; import android.util.Log; public class MyTest extends AndroidTestCase { private final String TAG = "MyTest"; public MyTest() { // TODO Auto-generated constructor stub } public void saveFile() { Context context = getContext(); FileService fileService = new FileService(context); boolean flag = fileService.saveContentToSdcard("hello.txt", "你好"); Log.i(TAG, "-->>" + flag); } public void readFile() { Context context = getContext(); FileService fileService = new FileService(context); String msgString = fileService.getFileFromSdcard("hello.txt"); Log.i(TAG, "-->>" + msgString); } }
2.將文件存儲在外接存儲設備中(SD卡)
一般,手機的內存是極其有限的,更廣泛的作法是將文件存儲到SD卡中。
將文件存儲在外接存儲設備中的方法和將文件存儲在設備自己的存儲空間中的方法相似,惟一的區別是每次向SD卡中存儲以及從SD卡中讀取文件時,都須要檢測SD卡的狀態。
2.1檢測SD卡的狀態
在Android中,檢測SD卡的狀態須要使用到Environment類。經過使用該類的getExternalStorageState()方法能夠得到外接存儲設備(SD卡)的狀態。其中,外接存儲設備的狀態有九種,具體如圖2所示。
圖2 外接存儲設備狀態
其中,MEDIA_MOUNTED表示外接存儲設備可讀可寫。
參考文獻:http://www.cnblogs.com/menlsh/archive/2013/04/02/2997084.html