欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现文件的分割和组装

程序员文章站 2022-08-17 20:36:24
本文以实例形式讲述了android实现文件的分割和组装的方法,主要是针对udp数据包进行的分割和组装。分享给大家供大家参考之用。具体方法如下: 一般来说,在使用udp数据...

本文以实例形式讲述了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程序设计有一定的借鉴价值。