標籤:android 資料存放區 sdcard file 讀寫
個人學習整理,如有不足之處,請不吝指教。轉載請註明:@CSU-Max
讀寫本應用程式資料檔案夾中的檔案 此種方法讀寫的檔案在/data/data/<應用程式套件組合名>中 android 中提供了 openFileInput(String fileName) 和 openFileOutput(String fileName, int mode) 兩個方法來讀取本應用程式資料檔案夾中的檔案和向其寫入。 openFileInput(String fileName) 開啟檔案輸入資料流 openFileOutput(String fileName, int mode) 開啟檔案輸出資料流註:openFileOutput(String fileName, int mode) 中的參數 mode 指定檔案開啟的形式: MODE_PRIVATE :該檔案只能被當前程式讀寫 MODE_APPEND :以追加的模式開啟檔案,應用程式可以向檔案中追加內容 MODE_WORLD_READABLE :該檔案的內容可以被其他應用程式讀取 MODE_WORLD_WRITEABLE : 該檔案的內容可以被其他應用程式讀和寫執行個體: 本執行個體程式介面上檔案輸入部分有一個輸入框和一個按鈕,點擊按鈕可以將輸入框中輸入的資訊寫入到指定的檔案中去;讀取部分有一個文字框和一個按鈕,點擊按鈕文字框會顯示指定檔案中的內容。 讀取: 寫入:
驗證寫入:
執行個體代碼:
package com.example.filedemo;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.PrintStream;import android.os.Bundle;import android.app.Activity;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;/** * * @author CSUMax * @version 1.0 2014-4-24 */public class MainActivity extends Activity {private Button bt_main_in; // 寫入檔案按鈕private Button bt_main_out; // 讀取檔案按鈕private EditText et_main_in;// 輸入文字框private TextView tv_main_out;// 顯示檔案內容@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);bt_main_in = (Button) this.findViewById(R.id.bt_main_in);bt_main_out = (Button) this.findViewById(R.id.bt_main_out);et_main_in = (EditText) this.findViewById(R.id.et_main_in);tv_main_out = (TextView) this.findViewById(R.id.tv_main_out);// 點擊按鈕將輸入框中的內容寫到檔案中bt_main_in.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {String fileName = "demo.txt";String text = et_main_in.getText().toString();writeToFile(text, fileName);et_main_in.setText("");}});// 點擊按鈕將檔案中內容讀取出來顯示在文字框中bt_main_out.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {String fileName = "demo.txt";tv_main_out.setText(readFromFile(fileName));}});}/** * 讀取檔案 * * @param fileName * @return */public String readFromFile(String fileName) {try {FileInputStream fis = openFileInput(fileName);byte[] bytes = new byte[1024];StringBuffer sb = new StringBuffer();int i = 0;i = fis.read(bytes);if (i > 0) {sb.append(new String(bytes, 0, i));}return sb.toString();} catch (Exception e) {e.printStackTrace();}return null;}/** * 寫入檔案 * * @param text * 寫入的內容 * @param fileName * 目標檔案的檔案名稱 */public void writeToFile(String text, String fileName) {try {// MODE_APPEND模式寫入,即追加模式FileOutputStream fos = openFileOutput(fileName, MODE_APPEND);PrintStream ps = new PrintStream(fos);ps.println(text);ps.close();} catch (Exception e) {e.printStackTrace();}}}
程式中的 demo.txt 檔案可以通過 File Explorer 中 /data/data/<應用程式套件組合名>/files/demo.txt 看到,如所示(由於無關檔案較多,故分開截成兩幅圖了):
讀取資源檔中的檔案
此處以讀取 resource 的 raw 中檔案為例,在 res 檔案夾下建立一個 raw 檔案夾,將之前的 demo.txt 檔案複製進去。
主要代碼:
public class ReadFileUtil { public static String readFromRaw(Context context, int id) { String str = ""; try { // 得到輸入資料流 InputStream is = context.getResources().openRawResource(id); int length = is.available(); byte[] bytes = new byte[length]; int i = 0; i = is.read(bytes); if (i > 0) { // 設定編碼 str = EncodingUtils.getString(bytes, "UTF-8"); } is.close(); return str; } catch (Exception e) { // TODO: handle exception } return null; }}
測試代碼:
public class ReaderTest extends AndroidTestCase { private static final String TAG = "ReaderTest"; public void testReadFromRaw() { Log.i(TAG, "---------------"); String str = "Failed"; str = ReadFileUtil.readFromRaw(getContext(), R.raw.demo); Log.i(TAG, "========>" + str + "<========"); }}
註:資源檔下的檔案通過 R 檔案中確定的 id 來訪問,如此處 R.raw.
demo 。
讀寫 SD 記憶卡上的檔案
有時候我們會把一些資料存放區在SD卡上,現在我們來類比一下,在 File Explorer 視圖中向/mnt/sdcard/目錄下添加之前的 demo.txt 檔案,現在試著讀取該檔案中資訊並向其中寫入資訊。
主要代碼:
public class ReadFileUtil { public static String readFromSdcard(String fileName) { String str = ""; try { FileInputStream fis = new FileInputStream(fileName); int length = fis.available(); byte[] bytes = new byte[length]; int i = 0; i = fis.read(bytes); if (i > 0) { // 設定編碼 str = EncodingUtils.getString(bytes, "UTF-8"); } fis.close(); return str; } catch (Exception e) { // TODO: handle exception } return null; } /** * --注意向SD卡中的檔案寫入資訊時,要在AndroidManifest.xml檔案中加入相應的許可權-- */ public static void writeToSdcard(String text, String fileName){ try { //構造方法的第二個參數表示追加模式 FileOutputStream fos = new FileOutputStream(fileName, true); byte[] bytes = text.getBytes(); fos.write(bytes); fos.close(); } catch (Exception e) { e.printStackTrace(); } } }
測試代碼:
public class ReaderTest extends AndroidTestCase { private static final String TAG = "ReaderTest"; public void testReadFromSdcard() { Log.i(TAG, "---------------"); String str = "Failed"; str = ReadFileUtil.readFromSdcard("/mnt/sdcard/demo.txt"); Log.i(TAG, "========>" + str + "<========"); } public void testWriteToSdcard() { Log.i(TAG, "---------------"); String text = " Max "; ReadFileUtil.writeToSdcard(text, "/mnt/sdcard/demo.txt"); }}
註: 一般讀寫本應用程式中的檔案要使用 openFileInput 和 openFileOutput ;而讀寫 SD 記憶卡中的檔案需要使用 FileInputStrea 和 FileOutputStream 。 預設對SD卡中檔案只有可讀許可權,所以向SD卡中寫入資料時需要加入相應的許可權。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
***************************************************************************
* 轉載請註明出處: @CSU-Max http://blog.csdn.net/csu_max *
***************************************************************************