編輯:關於Android編程
本文以實例形式講述了Android實現文件的分割和組裝的方法,主要是針對UDP數據包進行的分割和組裝。分享給大家供大家參考之用。具體方法如下:
一般來說,在使用UDP數據包發送文件時,由於UDP數據包大小的限制,一個文件要放在幾個UDP數據包裡面發送,這就需要把一個文件分割成若干部分,分別放進若干個UDP數據包裡面,在接收端,收到這些UDP數據包以後,再對文件進行組裝,從而得到一個完整的文件。步驟如下:
一、定義的相關變量:
// 要分割的文件 public static RandomAccessFile raf_split; // 要合並的文件 public static RandomAccessFile raf_merge; // 文件長度 public static long len; // Byte數組 public static int offset; public static int os = 5; public static int size = 1024-os; public static byte file_data[] = new byte[1024];
二、FileOperClass類實現文件的分割和組裝操作:
// 構造函數(0-分割文件,1-合並文件) public FileOperClass(String file, int x){ // 分割文件 if (x == 0){ try{ // RandomAccessFile以只讀方式打開文件 raf_split = new RandomAccessFile(file,"r"); // 獲得文件大小 len = raf_split.length(); // 需要幾個數據包 pnum = (int) Math.ceil((raf_split.length()*1.0)/(size * 1.0)) + 1; // 最後一個數據包裡面數據多少 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){ } } }
三、分割文件:
// 分割文件並發送 public static void split(){ int m1,m2; p_id = 0; offset = 0; try{ while (len>0){ // 數據包類型 file_data[0] = (byte) 2; // 客戶端ID file_data[1] = (byte) MainActivity.cli_id; // 會話ID file_data[2] = (byte) MainActivity.ses_id; // 該會話數據包數量 file_data[3] = (byte) pnum; // 數據包ID file_data[4] = (byte) p_id; // seek raf_split.seek(offset); // 讀出數據到file_data raf_split.read(file_data, os, size); // 發送數據包 MainActivity.trd_send.set_action(2, file_data); len = len - size; p_id = p_id + 1; offset = offset + size; } // 記錄最後一個數據包剩余字節的數據包 // 數據包類型 file_data[0] = (byte) 2; // 客戶端ID file_data[1] = (byte) MainActivity.cli_id; // 會話ID file_data[2] = (byte) MainActivity.ses_id; // 該會話數據包數量 file_data[3] = (byte) pnum; // 數據包ID file_data[4] = (byte) p_id; m1 = pmod / 128; m2 = pmod % 128; file_data[5] = (byte) m1; file_data[6] = (byte) m2; // 發送數據包 MainActivity.trd_send.set_action(2, file_data); } catch (Exception e){ } finally{ // 關閉文件 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++){ // 判斷數據包是否已經齊全 if ((MainActivity.r_datapacket.get(i).c_id == MainActivity.mer_cli_id) && (MainActivity.r_datapacket.get(i).ses_id == MainActivity.mer_ses_id)) { // 讀出數據包的數據進byte數組 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數組寫進文件 raf_merge.write(tmp_byte[i], os, size); } // 最後一個byte數組寫進文件 raf_merge.write(tmp_byte[MainActivity.mer_pkt_num-1], os, MainActivity.mer_pkt_mod ); } catch(Exception e){ } finally{ // 關閉文件 try{ raf_merge.close(); } catch(Exception err){ } } }
相信本文所述對大家的Android程序設計有一定的借鑒價值。
Android調試工具 ADBADB Android Debug Bridge。ADB工具位於Android SDK安裝目錄的platform-tools子目錄。主要功能
第5節 按鈕開關對於硬件的控制,我們常用硬件開關來控制Arduino開發板上其他外接硬件的通斷邏輯。比如,一盞LED燈,硬件上最好有個開關,按一下開關,就讓LED燈亮,再
Blur自從iOS系統引入了Blur效果,也就是所謂的毛玻璃、模糊化效果,磨砂效果,各大系統就開始競相模仿,這是一個怎樣的效果呢,我們現來看一些圖:這些就是典型的Blur
根據提供的課程信息,動態生成課程表。不同於網上流傳的課表形式,課程節數是固定,本課表的課程節數不固定。1、效果圖每天共有12節課,上課節數每天都不同。2、布局文件代碼周一