Android中的檔案儲存體技術
檔案儲存體是每個系統都應該具有的功能,Android系統採用Java語言開發,所以它的檔案儲存體功能基本上和J2SE一樣的。為什麼會引入檔案儲存體?因為大檔案、圖片等我們若只儲存在手機中很有限,一般都是用一個外存放裝置進行儲存。好了今天我們就講講用編程的方式在Android系統中進行儲存。
檔案儲存體的位置
一般檔案預設儲存在/data/data/<包>/files/***.***(針對我們開發的APK的時候),當然我們也可以儲存在儲存卡上(這個時候需要在androidManifest.xml 設定檔案的操作許可權)。
openFileOutput() 寫入
在Activity組件中提供了此方法用於寫入檔案資料,我們先看以下代碼,再做解釋:
public void store() {
try {
//擷取檔案的輸出資料流
FileOutputStream out=this.openFileOutput("test.txt",Context.MODE_WORLD_READABLE);
//將介面上textboox1控制項的值寫入到輸出檔案流中
out.write(textboox1.getText().toString().getBytes());
//關閉檔案流,資料儲存成功
out.close();
} catch (FileNotFoundException e) {
return;
}
catch (IOException e){
return ;
}
}
從代碼中我們可以看到openFileOutput()有兩個參數,第一個是檔案名稱,第二個則是檔案的操作許可權。它有以下操作許可權:
Context.MODE_PRIVATE=0:為預設操作模式,代表該檔案是私人資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔案的內容,如果想把新寫入的內容追加到原檔案中。可以使用Context.MODE_APPEND;
Context.MODE_APPEND = 32768:模式會檢查檔案是否存在,存在就往檔案追加內容,否則就建立新檔案;
Context.MODE_WORLD_READABLE = 1:表示當前檔案可以被其他應用讀取;
Context.MODE_WORLD_WRITEABLE= 2:表示當前檔案可以被其他應用寫入;
如果想需要有讀寫權限,需要將Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE表示。
openFileInput() 讀取
Activity組件提供了讀取的方法,預設的檔案在/data/data/<包>/files/下,執行個體代碼如下:
public void onload()
{
try {
//檔案輸入資料流
FileInputStream in=this.openFileInput("test.txt");
ByteArrayOutputStream stream=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int length=-1;
//讀取資料並放在byte數組中
while((length=in.read(buffer))!=-1) {
//寫入byte檔案流
stream.write(buffer,0,length);
}
stream.close();
in.close();
textboot1.setText(stream.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e){
return ;
}
}
SDCard 資料存放區
前面已經講到資料在儲存到外部裝置時候,需要設定其操作許可權。以下的操作方式是我們在實際項目開發過程中常用到的。
//1.用於擷取SDCard的狀態,如果手機裝有SDCard,並且可以進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//2.擷取SDCard目錄
File sdCardDir = Environment.getExternalStorageDirectory();
//3.在外部裝置上建立 擷取檔案
File saveFile = new File(sdCardDir, “test.txt”);
//檔案儲存體位置在/sdcard/test.txt
//等價於 File saveFile = new File("/sdcard/a.txt");
//4.檔案輸出資料流
FileOutputStream outStream = new FileOutputStream(saveFile);
//5.寫入資料
outStream.write("test".getBytes());
//6.關閉檔案輸出資料流
outStream.close();
}