Android-漢語詞典開發-assets,raw的InputStream資料流操作(檔案分割合并)

來源:互聯網
上載者:User

檔案移動

一. 在應用中由於種種原因需要將一些外部檔案放在 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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.