Android資料庫檔案路徑問題

來源:互聯網
上載者:User

// 獲得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();

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.