Android實(shí)現(xiàn)文件的分割和組裝
本文以實(shí)例形式講述了Android實(shí)現(xiàn)文件的分割和組裝的方法,主要是針對UDP數(shù)據(jù)包進(jìn)行的分割和組裝。分享給大家供大家參考之用。具體方法如下:
一般來說,在使用UDP數(shù)據(jù)包發(fā)送文件時(shí),由于UDP數(shù)據(jù)包大小的限制,一個(gè)文件要放在幾個(gè)UDP數(shù)據(jù)包里面發(fā)送,這就需要把一個(gè)文件分割成若干部分,分別放進(jìn)若干個(gè)UDP數(shù)據(jù)包里面,在接收端,收到這些UDP數(shù)據(jù)包以后,再對文件進(jìn)行組裝,從而得到一個(gè)完整的文件。步驟如下:
一、定義的相關(guān)變量:
// 要分割的文件 public static RandomAccessFile raf_split; // 要合并的文件 public static RandomAccessFile raf_merge; // 文件長度 public static long len; // Byte數(shù)組 public static int offset; public static int os = 5; public static int size = 1024-os; public static byte file_data[] = new byte[1024];
二、FileOperClass類實(shí)現(xiàn)文件的分割和組裝操作:
// 構(gòu)造函數(shù)(0-分割文件,1-合并文件) public FileOperClass(String file, int x){ // 分割文件 if (x == 0){ try{ // RandomAccessFile以只讀方式打開文件 raf_split = new RandomAccessFile(file,"r"); // 獲得文件大小 len = raf_split.length(); // 需要幾個(gè)數(shù)據(jù)包 pnum = (int) Math.ceil((raf_split.length()*1.0)/(size * 1.0)) + 1; // 最后一個(gè)數(shù)據(jù)包里面數(shù)據(jù)多少 pmod = (int) (raf_split.length() - (pnum -2)* size); // 分割文件 split(); } catch (Exception e){ } } // 合并文件 else if (x == 1){ try{ // RandomAccessFile以讀寫方式打開文件 raf_merge = new RandomAccessFile(file,"rw"); // 合并文件 merge(); } catch (Exception e){ } } }
三、分割文件:
// 分割文件并發(fā)送 public static void split(){ int m1,m2; p_id = 0; offset = 0; try{ while (len>0){ // 數(shù)據(jù)包類型 file_data[0] = (byte) 2; // 客戶端ID file_data[1] = (byte) MainActivity.cli_id; // 會(huì)話ID file_data[2] = (byte) MainActivity.ses_id; // 該會(huì)話數(shù)據(jù)包數(shù)量 file_data[3] = (byte) pnum; // 數(shù)據(jù)包ID file_data[4] = (byte) p_id; // seek raf_split.seek(offset); // 讀出數(shù)據(jù)到file_data raf_split.read(file_data, os, size); // 發(fā)送數(shù)據(jù)包 MainActivity.trd_send.set_action(2, file_data); len = len - size; p_id = p_id + 1; offset = offset + size; } // 記錄最后一個(gè)數(shù)據(jù)包剩余字節(jié)的數(shù)據(jù)包 // 數(shù)據(jù)包類型 file_data[0] = (byte) 2; // 客戶端ID file_data[1] = (byte) MainActivity.cli_id; // 會(huì)話ID file_data[2] = (byte) MainActivity.ses_id; // 該會(huì)話數(shù)據(jù)包數(shù)量 file_data[3] = (byte) pnum; // 數(shù)據(jù)包ID file_data[4] = (byte) p_id; m1 = pmod / 128; m2 = pmod % 128; file_data[5] = (byte) m1; file_data[6] = (byte) m2; // 發(fā)送數(shù)據(jù)包 MainActivity.trd_send.set_action(2, file_data); } catch (Exception e){ } finally{ // 關(guān)閉文件 try{ raf_split.close(); } catch(Exception err){ } } }
四、合并文件:
// 合并文件 public static void merge(){ byte[][] tmp_byte = new byte[MainActivity.mer_pkt_num][1024]; int i,j; try{ for(i=0; i<MainActivity.r_datapacket.size(); i++){ // 判斷數(shù)據(jù)包是否已經(jīng)齊全 if ((MainActivity.r_datapacket.get(i).c_id == MainActivity.mer_cli_id) && (MainActivity.r_datapacket.get(i).ses_id == MainActivity.mer_ses_id)) { // 讀出數(shù)據(jù)包的數(shù)據(jù)進(jìn)byte數(shù)組 tmp_byte[MainActivity.r_datapacket.get(i).p_id] = MainActivity.r_datapacket.get(i).b; } } for (i=0; i<MainActivity.mer_pkt_num-2; i++){ // 把byte數(shù)組寫進(jìn)文件 raf_merge.write(tmp_byte[i], os, size); } // 最后一個(gè)byte數(shù)組寫進(jìn)文件 raf_merge.write(tmp_byte[MainActivity.mer_pkt_num-1], os, MainActivity.mer_pkt_mod ); } catch(Exception e){ } finally{ // 關(guān)閉文件 try{ raf_merge.close(); } catch(Exception err){ } } }
相信本文所述對大家的Android程序設(shè)計(jì)有一定的借鑒價(jià)值。
- android利用xml實(shí)現(xiàn)分割線
- Android中Split()字符串分割特殊用法案例詳解
- 詳解Android中ListView實(shí)現(xiàn)圖文并列并且自定義分割線(完善仿微信APP)
- Android中控件GridView實(shí)現(xiàn)設(shè)置行列分割線的方法示例
- Android 關(guān)于ExpandableListView去掉里頭分割線的方法
- Android RecyclerView網(wǎng)格布局(支持多種分割線)詳解(2)
- Android取消EditText自動(dòng)獲取焦點(diǎn)默認(rèn)行為
- Android控件系列之EditText使用方法
- Android中EditText實(shí)現(xiàn)不可編輯解決辦法
- Android EditText實(shí)現(xiàn)分割輸入內(nèi)容
相關(guān)文章
Android底部導(dǎo)航欄的動(dòng)態(tài)替換方案
這篇文章主要為大家詳細(xì)介紹了Android底部導(dǎo)航欄的動(dòng)態(tài)替換方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12android studio 的下拉菜單Spinner使用詳解
這篇文章主要介紹了android studio 的下拉菜單Spinner使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Android中EditText 設(shè)置 imeOptions 無效問題的解決方法
有時(shí)候我們需要在EditText 輸出完之后 需要在鍵盤出現(xiàn) 右下角變成“Go”或“前往 搜索時(shí);通常我們需要設(shè)置Android:imeOptions屬性,但是今天我發(fā)現(xiàn)設(shè)置了無效,下面給大家分享下解決方案2016-12-12Android使用動(dòng)畫動(dòng)態(tài)添加商品進(jìn)購物車
這篇文章主要為大家詳細(xì)介紹了Android使用動(dòng)畫動(dòng)態(tài)添加商品進(jìn)購物車,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Android不顯示開機(jī)向?qū)Ш烷_機(jī)氣泡問題
這篇文章主要介紹了Android不顯示開機(jī)向?qū)Ш烷_機(jī)氣泡問題,需要的朋友可以參考下2019-05-05Android學(xué)習(xí)筆記之藍(lán)牙功能
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)筆記之藍(lán)牙功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09Android 中RxPermissions 的使用方法詳解
這篇文章主要介紹了Android 中RxPermissions 的使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10