檔案移動
一. 在應用中由於種種原因需要將一些外部檔案放在 assets 或者 raw 檔案夾內,以便進一步使用。這兩個檔案夾有以下的區別和聯絡:
1. 都是以資料流的形式進行讀取,從而導致 Java 中其他的一些讀取方式不能很好的作用在這些檔案上面,例如 RandomAccessFile 、 FileReader 等之類的類。如果由於需要需要使用基於檔案的類,則可以根據資料流建立建立臨時檔案( File.createTempFile )當做一個折中的辦法。這是一種方法,下面將會介紹另一種方法
2. raw 檔案夾中的檔案不能包含有目錄結構並且每個檔案會映射到一個 id ,而 assets 檔案夾可以有目錄結構。對於對檔案名稱敏感的程式則使用 raw 進行外部檔案儲存體較為方便,而對於較依賴目錄結構的檔案則使用 assets 儲存
3. 這兩個檔案夾中的檔案都不能太大,官方資料是小於 1M 。這點需要時刻記住,因為產生的問題十分隱蔽,在程式中可以找到該檔案也可以產生 inputStream 但是在讀取時會拋出 IOException 異常。這中大檔案需要先分割在進行讀取
4. 這兩個檔案夾對檔案名稱大小寫敏感,命名是盡量用小寫,並且在分割合并後也要注意檔案名稱,否則程式會認為它們是不同的檔案,但是在建立時會覆蓋掉先前的檔案(這點太隱蔽了, ~~~~(>_<)~~~~ )
以下是分割資料的代碼:
123456789101112131415161718192021222324 |
public static void CutFilesInSizeParts(InputStream fis,String OutputFileName, int MaxPartSize) {try { int TotalLength = fis.available();byte[] buffer = new byte[TotalLength + 1];int len = fis.read(buffer); int nbPart = len / MaxPartSize + 1;int CurPos = 0; for (int i = 0; i < nbPart; i++) {int PartLen = MaxPartSize;if (CurPos + PartLen >= len)PartLen = len - CurPos;String outRealFileName = OutputFileName + (i + 1);FileOutputStream fos = new FileOutputStream(outRealFileName);fos.write(buffer, CurPos, PartLen);CurPos += PartLen;}} catch (IOException e) {e.printStackTrace();}} |
二,正是以上兩個檔案夾只能產生 InputStream 資料流,當程式有別的需要時會顯的無能為力。例如在外面建立了一個 sqlite 的 db 檔案,該檔案需要內建到 apk 中只能放入這兩個檔案夾中,可是在使用時可要根據需要放置到 sdcard 中或者 database 中去。因此需要對讀取檔案並在相應位置產生目的檔案,按照自己需要的方式進行讀取,這也提供了第二種方法。這一步需要注意一下幾點:
1. 檔案的許可權,否則可能會被別的應用使用
2. 若是要對分割後的檔案進行合并,則要注意檔案順序
這裡附上合并資料並拷貝的代碼
1234567891011121314151617181920212223242526 |
//合并並拷貝資料public static void CreateFromRawDbFiles(File[] filelist,FileOutputStream Fos) { try {for (File file : filelist) {InputStream inputFile = new FileInputStream(file);int TotalLength = 0;try {TotalLength = inputFile.available();} catch (IOException e) {}// Reading and writing the file Method 1 :byte[] buffer = new byte[TotalLength];int len = 0;try {len = inputFile.read(buffer);} catch (IOException e) {}Fos.write(buffer,0,len);inputFile.close();}Fos.close();} catch (IOException e) {}} |
原文連結:http://ishelf.javaeye.com/blog/724633