天天看點

Android資料的存儲方式(五) —— 檔案存儲資料

關于檔案存儲,Activity提供了openFileOutput()方法可以用于把資料輸出到檔案中,具體的實作過程與在J2SE環境中儲存資料到檔案中是一樣的。

檔案可用來存放大量資料,如文本、圖檔、音頻等。

預設位置:/data/data/<包>/files/***.***。

代碼示例:

  1. publicvoid save() 
  2.  { 
  3. try { 
  4.             FileOutputStream outStream=this.openFileOutput("a.txt",Context.MODE_WORLD_READABLE); 
  5.             outStream.write(text.getText().toString().getBytes()); 
  6.             outStream.close(); 
  7.             Toast.makeText(MyActivity.this,"Saved",Toast.LENGTH_LONG).show(); 
  8.         } catch (FileNotFoundException e) { 
  9. return; 
  10.         } 
  11. catch (IOException e){ 
  12. return ; 
  13.         } 
  14.  } 

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 ,隻有這樣其他程式才能正确通路。

讀取檔案示例:

  1. publicvoid load() 
  2. try { 
  3.         FileInputStream inStream=this.openFileInput("a.txt"); 
  4.         ByteArrayOutputStream stream=new ByteArrayOutputStream(); 
  5. byte[] buffer=newbyte[1024]; 
  6. int length=-1; 
  7. while((length=inStream.read(buffer))!=-1)   { 
  8.             stream.write(buffer,0,length); 
  9.         } 
  10.         stream.close(); 
  11.         inStream.close(); 
  12.         text.setText(stream.toString()); 
  13. Toast.makeText(MyActivity.this,"Loaded",Toast.LENGTH_LONG).show(); 
  14.     } catch (FileNotFoundException e) { 
  15.         e.printStackTrace(); 
  16.     } 
  17. catch (IOException e){ 
  18. return ; 
  19.     } 
  20. }

對于私有檔案隻能被建立該檔案的應用通路,如果希望檔案能被其他應用讀和寫,可以在建立檔案時,指定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的權限。

  1. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  
  2. File sdCardDir = Environment.getExternalStorageDirectory();//擷取SDCard目錄 
  3. File saveFile = new File(sdCardDir, “a.txt”); 
  4.         FileOutputStream outStream = new FileOutputStream(saveFile); 
  5.         outStream.write("test".getBytes()); 
  6.         outStream.close(); 
  7. }  

Environment.getExternalStorageState()方法用于擷取SDCard的狀态,如果手機裝有SDCard,并且可以進行讀寫,那麼方法傳回的狀态等于Environment.MEDIA_MOUNTED。  

Environment.getExternalStorageDirectory()方法用于擷取SDCard的目錄,當然要擷取SDCard的目錄,你也可以這樣寫: 

  1. File sdCardDir = new File("/sdcard"); //擷取SDCard目錄  
  2. File saveFile = new File(sdCardDir, "itcast.txt");  
  3. //上面兩句代碼可以合成一句:  
  4. File saveFile = new File("/sdcard/a.txt");  
  5. FileOutputStream outStream = new FileOutputStream(saveFile);  
  6. outStream.write("test".getBytes());  
  7. outStream.close();