// 獲得dictionary.db檔案的絕對路徑<br /> String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;<br /> File dir = new File(DATABASE_PATH);<br /> // 如果/sdcard/dictionary目錄中存在,建立這個目錄<br /> if (!dir.exists())<br /> dir.mkdir();<br /> // 如果在/sdcard/dictionary目錄中不存在<br /> // dictionary.db檔案,則從res/raw目錄中複製這個檔案到<br /> // SD卡的目錄(/sdcard/dictionary)<br /> if (!(new File(databaseFilename)).exists()) {<br /> // 獲得封裝dictionary.db檔案的InputStream對象<br /> InputStream is = getResources().openRawResource(<br /> R.raw.dictionary);<br /> FileOutputStream fos = new FileOutputStream(databaseFilename);<br /> byte[] buffer = new byte[8192];<br /> int count = 0;<br /> // 開始複製dictionary.db檔案<br /> while ((count = is.read(buffer)) > 0) {<br /> fos.write(buffer, 0, count);<br /> } </p><p> fos.close();<br /> is.close();
Android支援四種資料存放區方式,分別是Preference, File, DataBase, Content Provider
。這幾天工作上的一個測試程式要求儲存一個影像檔,用了用File的這種方式,有了一點小小的心得。
先說下,Preference,File, DataBase這三種方式分別對應的目錄是/data/data/Package Name
/Shared_Pref, /data/data/Package Name
/files, /data/data/Package Name
/database 。
在Android中通常使用File儲存方式是用Context.openFileOutput(String fileName, int mode)和Context.openFileInput(String fileName)。
Context.openFileOutput(String fileName, int mode)產生的檔案自動儲存在/data/data/Package Name
/files目錄下,其全路徑是/data/data/Package Name
/files/fileName 。
注意下,這裡的參數fileName不可以包含路徑分割符(如"/")。
通常來說,這種方式產生的檔案只能在這個apk內訪問。但這個結論是指使用Context.openFileInput(String fileName)的方式。使用這種方式,每個apk只可以訪問自己的/data/data/Package Name
/files目錄下的檔案,原因很簡單,參數fileName中不可以包含路徑分割符,Android會自動在/data/data/Package Name
/files目錄下尋找檔案名稱為fileName的檔案。
但是如果你直接使用這個File,那麼這個File在其它apk中也是可以訪問的,不過要注意在之前調用Context.openFileOutput(String file, int mode)時不要使用預設的mode:MODE_PRIVATE
,而應該使用MODE_WORLD_READABLE
。使用預設mode產生的檔案的許可權是“660”(也就是rw-rw----),而使用後者組建檔案的許可權是允許運行別的apk訪問的。代碼如下:
File file = new File("/data/data/Package Name/files/fileName");
另外還有一個方法可以改變這個組建檔案的許可權。可以直接在Java代碼中執行Linux命令,畢竟Android歸根到底也是Linux .代碼如下:
Process process = Runtime.getProcess().exec("chmod 666 /data/data/Package Name/files/fileName
");
process.waitFor();