Android实现文件的分割和组装
本文以实例形式讲述了Android实现文件的分割和组装的方法,主要是针对UDP数据包进行的分割和组装。分享给大家供大家参考之用。具体方法如下:
一般来说,在使用UDP数据包发送文件时,由于UDP数据包大小的限制,一个文件要放在几个UDP数据包里面发送,这就需要把一个文件分割成若干部分,分别放进若干个UDP数据包里面,在接收端,收到这些UDP数据包以后,再对文件进行组装,从而得到一个完整的文件。步骤如下:
一、定义的相关变量:
//要分割的文件 publicstaticRandomAccessFileraf_split; //要合并的文件 publicstaticRandomAccessFileraf_merge; //文件长度 publicstaticlonglen; //Byte数组 publicstaticintoffset; publicstaticintos=5; publicstaticintsize=1024-os; publicstaticbytefile_data[]=newbyte[1024];
二、FileOperClass类实现文件的分割和组装操作:
//构造函数(0-分割文件,1-合并文件)
publicFileOperClass(Stringfile,intx){
//分割文件
if(x==0){
try{
//RandomAccessFile以只读方式打开文件
raf_split=newRandomAccessFile(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(Exceptione){
}
}
//合并文件
elseif(x==1){
try{
//RandomAccessFile以读写方式打开文件
raf_merge=newRandomAccessFile(file,"rw");
//合并文件
merge();
}
catch(Exceptione){
}
}
}
三、分割文件:
//分割文件并发送
publicstaticvoidsplit(){
intm1,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(Exceptione){
}
finally{
//关闭文件
try{
raf_split.close();
}
catch(Exceptionerr){
}
}
}
四、合并文件:
//合并文件
publicstaticvoidmerge(){
byte[][]tmp_byte=newbyte[MainActivity.mer_pkt_num][1024];
inti,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(Exceptione){
}
finally{
//关闭文件
try{
raf_merge.close();
}
catch(Exceptionerr){
}
}
}
相信本文所述对大家的Android程序设计有一定的借鉴价值。