標籤:apk apk安裝建立檔案夾 apk安裝時拷貝檔案 檔案輸入輸出資料流操作
項目已搞定,今天把.apk檔案弄到另外一台非調試手機上用,發現一個問題。因為要畫圖,所以繪圖的點的資料儲存在一個.txt的文字檔中,上次直接把它用usb傳到指定檔案夾下的,但是明顯不科學,因為使用者下載了你的.apk檔案,你卻告訴他,還要把這個文字檔拷貝到指定的檔案夾下,所以,我就要解決這個問題,就是把文字檔打包在apk檔案中,安裝.apk時就讓建立一個程式檔案夾,然後把文字檔拷貝到這個目錄檔案夾裡,使用者運行程式,就可以繪圖,不用再讓他拷貝一份繪圖的點的座標的資料。同理,其實我這裡還有設計軌廓的資料和標準軌廓的資料也是要初始時就要存在的。
這裡就給了一個方法,用來解決這個問題。
首先,你要把運行必須的檔案命名好,只能是a-z,0-9這36個字元(它是這麼提醒我的)組成的檔案名稱,然後在你的工程下建立一個檔案夾raw,一般來說這個檔案夾是沒有的,因為這個檔案夾下的檔案是不會經過壓縮的,而是直接拷貝到apk檔案中,最後把你的檔案添加到raw檔案夾中,這樣就做好了第一步。
類似如的建立檔案夾,添加檔案就可以了。
添加了檔案,那麼怎麼copy這些檔案到指定目錄下呢?這裡有幾點,其實都是檔案操作那一塊的知識點。第一,判斷指定的檔案目錄和檔案是否存在,不存在就要先建立;第二,引用raw中的檔案;第三,把raw中檔案copy到建立的檔案中,或者說是raw中檔案寫到輸出資料流,再把輸入資料流寫到手機上建立的檔案中。
我這裡簡單的寫了一個函數,函數前兩個參數,一個是寫入到手機上的檔案的目錄路徑,一個是新建立的檔案名稱字。第三個參數是最重要的,也就是raw中檔案是以gen檔案夾下的R.java中的id來索引的,就像我們的介面裡面的button在程式中引用也是通過id來索引的。這第三個參數是一個int型,就是這個檔案的id,R.java中是int型,大家可以看看。這個函數代碼如下:
private void copyfile(String fileDirPath,String fileName,int id) {String filePath = fileDirPath + "/" + fileName;// 檔案路徑try {File dir = new File(fileDirPath);// 目錄路徑if (!dir.exists()) {// 如果不存在,則建立路徑名dir.mkdirs();}// 目錄存在,則將apk中raw檔案夾中的需要的文檔複製到該目錄下File file = new File(filePath);if (!file.exists()) {// 檔案不存在InputStream is = getResources().openRawResource(id);// 通過raw得到資料資源FileOutputStream fs = new FileOutputStream(file);byte[] buffer = new byte[1024];int count = 0;// 迴圈寫出while ((count = is.read(buffer)) > 0) {fs.write(buffer, 0, count);}fs.close();// 關閉流is.close();}} catch (Exception e) {e.printStackTrace();}}
我們可以在第一個activity的oncreate方法中調運這個函數,這樣安裝.apk檔案後,第一次開啟程式,就建立了指定檔案,這個檔案是從raw中拷貝過去的。
createFile("/sdcard/test/data","TB60.txt",R.raw.tb60);createFile("/sdcard/test/guikuo","設計軌廓.txt",R.raw.sjgk);createFile("/sdcard/test/guikuo","標準軌廓.txt",R.raw.bzgk);
上面的參數都是自己可以修改的。不過,你安裝之後,如果沒有運行程式,是不會找到這些檔案夾的,因為這是在第一運行是才建立,下次運行,判斷檔案已存在,就不做任何處理了。
其實,這是一個很簡單的細節,就是對檔案的操作,不過有時還真的用得到,當然,不僅僅是文字檔,音樂檔案也是可以放在這裡面的,大家可以多嘗試一下。