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程序设计有一定的借鉴价值。