1. 程式人生 > >Android初試--Android中的檔案操作之ROM操作(1)

Android初試--Android中的檔案操作之ROM操作(1)

RAM(Random Access Memory)隨機儲存器,在手機中稱為執行記憶體。通俗的說,就像電腦的記憶體。在斷電以後儲存在上面的資料會自動消失。
ROM(Read-Only Memory)只讀儲存器,存放手機韌體程式碼的儲存器,比如手機的作業系統、一些應用程式如遊戲等。通俗的說,就像電腦的硬碟。在斷電以後儲存在上面的資料不會自動消失。
SDCARD:通俗的說,就像外接硬碟。

①往手機自帶的儲存空間寫入檔案
FileOutputStream outStream = this.getContext().openFileOutput(“test.txt”, Context.MODE_PRIVATE);
outStream.write(“helloworld”.getBytes());
outStream.close();

openFileOutput(String name, int mode)方法的第一引數用於指定檔名稱,不能包含路徑分隔符“/”,如果檔案不存在,Android應用會自動建立它。
建立的檔案儲存在/data/data//files目錄,如:/data/data/com.rxr.file/files/test.txt,
通過點選Eclipse選單“Window”-“Show View”-“Other”,在對話視窗中展開Android資料夾,選擇下面的File Explorer檢視,然後在File Explorer檢視中展開/data/data/com.rxr.file/files目錄就可以看到儲存的檔案test.txt。
openFileOutput(String name, int mode)方法的第二引數用於指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2

Context.MODE_PRIVATE:為預設操作模式,代表該檔案是私有資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔案的內容,如果想把新寫入的內容追加到原檔案中,可以使用Context.MODE_APPEND。
Context.MODE_APPEND:建立的檔案是私有資料,該模式會檢查檔案是否存在,存在就往檔案追加內容,否則就建立新檔案。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該檔案。
MODE_WORLD_READABLE:表示當前檔案可以被其他應用讀取;MODE_WORLD_WRITEABLE:表示當前檔案可以被其他應用寫入。
如果希望該檔案被其他應用讀和寫,可以這樣寫: openFileOutput(“test.txt”, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,當應用程式(.apk)在安裝時系統就會分配給他一個userid,如果該應用要去訪問其他資源比如檔案的時候,就需要userid匹配。
預設情況下,任何應用建立的檔案、SharedPreferences、資料庫都應該是私有的(位於/data/data//files),其他程式無法訪問。除非在建立時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE,只有這樣設定其他程式才能正確訪問。

②從手機自帶的儲存空間裡面讀取檔案
FileInputStream inStream = this.getContext().openFileInput(“test.txt”);
//定義緩衝區大小
byte [] buffer = new byte[1024];
int len = 0;
//記憶體輸出流
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
//從輸入流裡面讀取資料到緩衝區,如果讀取到流的末尾返回-1,否則返回讀取到的實際位元組長度
while( (len = inStream.read(buffer)) != -1 ){
//往記憶體中寫入資料
outStream.write(buffer, 0, len);
}
//獲取記憶體中該檔案的二進位制資料
byte [] data = outStream.toByteArray();
outStream.close();
inStream.close();

Activity的getFilesDir()方法:返回/data/data/com.rxr.file/files檔案物件
Activity的getCacheDir()方法:返回/data/data/com.rxr.file/cache檔案物件,存放一些快取資料

import java.io.FileInputStream;
import java.io.FileOutputStream;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
    private  EditText  inputtext=null;
    private  Button  save=null;
    private  Button  read=null;
    private  TextView  showdata=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //載入佈局檔案
        setContentView(R.layout.activity_main);
        //元件的初始化
        init();  
    }
    /*
     * 元件的初始化
     */
    private void init() {
        inputtext= (EditText)findViewById(R.id.editText1);
        save= (Button)findViewById(R.id.button1);
        read= (Button)findViewById(R.id.button2);
        showdata= (TextView)findViewById(R.id.textView2);
        MyClick  click=new MyClick();
        //給按鈕新增單擊事件
        save.setOnClickListener(click);
        read.setOnClickListener(click);
    }
    /*
     * 單擊事件的介面類
     */
    public  class  MyClick  implements OnClickListener{
        @Override
        public void onClick(View view) {
        switch(view.getId()){
        case R.id.button1:
            //儲存資料到手機自帶的儲存空間
            saveDataToRom();
            Toast.makeText(MainActivity.this, "資料儲存成功", 3000).show();
            break;
        case  R.id.button2:
            //從手機自帶的儲存空間讀取資料
            fromRomReadData();
            break;
        }
        }
    }
    /*
     * 儲存資料到手機自帶的儲存空間
     */
    public void saveDataToRom() {
        //得到文字框中輸入的資料
        String  info=inputtext.getText().toString();
        //開啟輸出流
        //openFileOutput有兩個引數
        //第一個引數  儲存檔案的檔名稱
        //第二個引數 檔案的操作模式
        /*
         * Context.MODE_PRIVATE = 0    私有模式,不允許追加
           Context.MODE_APPEND = 32768   私有模式,允許追加
           Context.MODE_WORLD_READABLE = 1  允許其他程式只讀
           Context.MODE_WORLD_WRITEABLE = 2 允許其他程式可寫 
         */
        try {
            FileOutputStream  output=this.openFileOutput("rxr.txt", Context.MODE_APPEND);
            //儲存資料
            output.write(info.getBytes());
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /*
     * 從手機自帶的儲存空間讀取資料
     */
    public void fromRomReadData() {
        String info="";
        //得到輸入流物件
        try {
            FileInputStream input=this.openFileInput("rxr.txt");
            byte  databyte[]=new byte[1000];
            int len=input.read(databyte);
            info=new String(databyte,0,len);
            input.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //將資料顯示在textview上
        showdata.setText(info);
    }
}