編輯: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登錄實例
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
android+json+php+mysql實現用戶反饋功能方法解析
相信每個項目都會有用戶反饋建議等功能,這個實現的方法很多,下面是我實現的方法,供大家交流。首先看具體界面,三個字段。名字,郵箱為選填,可以為空,建議不能為空。如有
Android 使用【AIDL】調用外部服務的解決方法
在Android 中有一種服務說是服務其實倒不如說是一個接口,這個接口名為:Android Interface Definition Language ,這個接口
Android加載Spinner
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用