1. 程式人生 > >【Android數據存儲】- File

【Android數據存儲】- File

idt cti click try exc sum 文件內容 andro mic


個人學習整理。如有不足之處,請不吝不吝賜教。

轉載請註明:@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 : 該文件的內容能夠被其它應用程序讀和寫 實例:
本實例程序界面上文件輸入部分有一個輸入框和一個button。點擊button能夠將輸入框中輸入的信息寫入到指定的文件裏去;讀取部分有一個文本框和一個button,點擊button文本框會顯示指定文件裏的內容。

讀取: 寫入: 技術分享 技術分享技術分享
技術分享 驗證寫入: 技術分享 技術分享

實例代碼:
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; // 寫入文件button
	private Button bt_main_out; // 讀取文件button
	private EditText et_main_in;// 輸入文本框
	private TextView tv_main_out;// 顯示文件內容

	@Override
	protected 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);

		// 點擊button將輸入框中的內容寫到文件裏
		bt_main_in.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String fileName = "demo.txt";
				String text = et_main_in.getText().toString();
				writeToFile(text, fileName);
				et_main_in.setText("");
			}
		});

		// 點擊button將文件裏內容讀取出來顯示在文本框中
		bt_main_out.setOnClickListener(new OnClickListener() {

			@Override
			public 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 *

***************************************************************************



【Android數據存儲】- File