關于檔案存儲,Activity提供了openFileOutput()方法可以用于把資料輸出到檔案中,具體的實作過程與在J2SE環境中儲存資料到檔案中是一樣的。
檔案可用來存放大量資料,如文本、圖檔、音頻等。
預設位置:/data/data/<包>/files/***.***。
代碼示例:
- publicvoid save()
- {
- try {
- FileOutputStream outStream=this.openFileOutput("a.txt",Context.MODE_WORLD_READABLE);
- outStream.write(text.getText().toString().getBytes());
- outStream.close();
- Toast.makeText(MyActivity.this,"Saved",Toast.LENGTH_LONG).show();
- } catch (FileNotFoundException e) {
- return;
- }
- catch (IOException e){
- return ;
- }
- }
openFileOutput()方法的第一參數用于指定檔案名稱,不能包含路徑分隔符“/” ,如果檔案不存在,Android 會自動建立它。
建立的檔案儲存在/data/data/<package name>/files目錄,如: /data/data /cn.itcast.action/files/itcast.txt ,通過點選Eclipse菜單 “Window”-“Show View”-“Other”,在對話視窗中展開android檔案夾,選擇下面的File Explorer視圖,然後在 File Explorer視圖中展開/data/data/<package name>/files目錄就可以看到該檔案。
openFileOutput()方法的第二參數用于指定操作模式,有四種模式,分别為:
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("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE); android 有一套自己的安全模型,當應用程式(.apk)在安裝時系統就會配置設定給他一個userid,當該應用要去通路其他資源比如檔案的時候,就需要userid 比對。預設情況下,任何應用建立的檔案,sharedpreferences,資料庫都應該是私有的(位于/data/data /<package name>/files),其他程式無法通路。
除非在建立時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,隻有這樣其他程式才能正确通路。
讀取檔案示例:
- publicvoid load()
- {
- try {
- FileInputStream inStream=this.openFileInput("a.txt");
- ByteArrayOutputStream stream=new ByteArrayOutputStream();
- byte[] buffer=newbyte[1024];
- int length=-1;
- while((length=inStream.read(buffer))!=-1) {
- stream.write(buffer,0,length);
- }
- stream.close();
- inStream.close();
- text.setText(stream.toString());
- Toast.makeText(MyActivity.this,"Loaded",Toast.LENGTH_LONG).show();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- catch (IOException e){
- return ;
- }
- }
對于私有檔案隻能被建立該檔案的應用通路,如果希望檔案能被其他應用讀和寫,可以在建立檔案時,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權限。
Activity 還提供了getCacheDir()和getFilesDir()方法: getCacheDir()方法用于擷取/data/data /<package name>/cache目錄 getFilesDir()方法用于擷取/data/data /<package name>/files目錄。
把檔案存入SDCard:
使用Activity的openFileOutput()方法儲存檔案,檔案是存放在手機空間上,一般手機的存儲空間不是很大,存放些小檔案還行,如果要存放像視訊這樣的大檔案,是不可行的。對于像視訊這樣的大檔案,我們可以把它存放在SDCard。
SDCard是幹什麼的?你可以把它看作是移動硬碟或U盤。 在模拟器中使用SDCard,你需要先建立一張SDCard卡(當然不是真的SDCard,隻是鏡像檔案)。
建立SDCard可以在Eclipse建立模拟器時随同建立,也可以使用DOS指令進行建立,如下: 在Dos視窗中進入android SDK安裝路徑的 tools目錄,輸入以下指令建立一張容量為2G的SDCard,檔案字尾可以随便取,建議使 用.img: mksdcard 2048M D:\AndroidTool\sdcard.img 在程式中通路SDCard,你需要申請通路 SDCard的權限。
在AndroidManifest.xml中加入通路SDCard的權限如下:
<!-- 在SDCard中建立與删除檔案權限 -->
< uses-permission android:name ="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard寫入資料權限 -->
< uses-permission android:name ="android.permission.WRITE_EXTERNAL_STORAGE" />
要往SDCard存放檔案,程式必須先判斷手機是否裝有SDCard,并且可以進行讀寫。
注意:通路SDCard必須在AndroidManifest.xml中加入通路SDCard的權限。
- if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
- File sdCardDir = Environment.getExternalStorageDirectory();//擷取SDCard目錄
- File saveFile = new File(sdCardDir, “a.txt”);
- FileOutputStream outStream = new FileOutputStream(saveFile);
- outStream.write("test".getBytes());
- outStream.close();
- }
Environment.getExternalStorageState()方法用于擷取SDCard的狀态,如果手機裝有SDCard,并且可以進行讀寫,那麼方法傳回的狀态等于Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()方法用于擷取SDCard的目錄,當然要擷取SDCard的目錄,你也可以這樣寫:
- File sdCardDir = new File("/sdcard"); //擷取SDCard目錄
- File saveFile = new File(sdCardDir, "itcast.txt");
- //上面兩句代碼可以合成一句:
- File saveFile = new File("/sdcard/a.txt");
- FileOutputStream outStream = new FileOutputStream(saveFile);
- outStream.write("test".getBytes());
- outStream.close();