169it科技资讯


当前位置:  编程技术>移动开发

Android实现文件的分割和组装

    来源: 互联网  发布时间:2014-10-26

本文以实例形式讲述了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录音应用实例教程

     本文以实例形式较为详细的展示了Android录音的实现方法,分享给大家供大家参考之用。具体方法如下: 首先是xml布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" android:gravity="center" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical......


    ▪Android双击返回键退出程序的实现方法

     本文实例讲述了Android双击返回键退出程序的实现方法,是Android程序开发中一个非常实用的功能,分享给大家供大家参考之用。具体方法如下: 一、实现思路: 用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态。定时器是每次用户按下返回键才去创建。 二、功能代码: /** * 菜单、返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-genera......


    ▪Android实现侦听电池状态显示、电量及充电动态显示的方法

     本文实例讲述了Android实现侦听电池状态显示、电量及充电动态显示的方法,是Android应用程序开发中非常常用的重要功能。分享给大家供大家参考之用。具体方法如下: 使用android系统的电池侦听和系统的电池图片如下; 引入源代码中的两个xml文件(这里我在android2.2的jar包中找不到,所以才引入,源代码路径:C:\android-sdk-windows\platforms\android-8\data\res\drawable),之后会发现stat_sys_battery.xml报错,如下图所示:   1.这些图引入到我的drawable目录下,然后将stat_sys_battery.xml中的图片引入路径更改,如下: ......


 
最新技术文章:
    ▪Android开发之登录验证实例教程

     本文所述实例源自一个项目开发中的登录验证功能,具体的要求就是,在Android端输入用户名和密码,在服务器端验证MySQL数据库中是否有此用户,实现之前当然首要的是,如何使Android端的数据发送到服务器端,具体的实现方法如下: 服务器端:ManageServlet.java代码如下: public class ManageServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); String name = request.getParameter("name"); String password......


    ▪Android开发之注册登录方法示例

     本文所述,继续上一篇关于Android端向服务器端发送数据的方法进一步完善注册登录的方法,由于版本问题出现一点瑕疵,今天经过调试已经解决,在这里给大家介绍一下。 在Android4.0以后版本的对于网络权限要求变得严格,致使上一篇所述的案例无法将数据发送到服务器端,当你一点击发送数据,Android控制台就会报错,错误当然是很让人头疼,基本上都是关于http的错误,所以可以肯定是Android虚拟机向服务器发送数据时出现了错误,经过一番检查与测试后才知道,4.0之后的版本,主线程中不允许调用网络,如果你需要的话,应该另起一个线程处理网络连接Th......


    ▪Android获取手机SIM卡运营商信息的方法

     本文实例讲述了Android获取手机SIM卡运营商信息的方法,对于Android程序设计有非常实用的价值。分享给大家供大家参考之用。具体方法如下: 主要功能代码如下: /** * 获取SIM卡运营商 * * @param context * @return */ public static String getOperators(Context context) { TelephonyManager tm = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); String operator = null; String IMSI = tm.getSubscriberId(); if (IMSI == null || IMSI.equals("")) { return operator; } if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) { operator = "中国移动"; } else if (IMSI.startsWith("4......


 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2017,169IT.COM,E-mail:www_169it_com#163.com(请将#改为@)

浙ICP备11055608号