本文以实例形式讲述了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

// 判断数据包是否已经齐全

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

// 把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实现文件的分割和组装相关推荐

  1. linux+多个字符分割字符串数组中,String的split()方法可以将字符串按照特定的分隔符拆分成字符串数组...

    在java.lang包中有String.split()方法,返回是一个数组------不管按照什么拆,拆出来是一个数组 String str = "1,2,3,4,5,6"; St ...

  2. android动态添加数组中,Android动态数组

    我正在通过Android Pull Parser技术解析XML文件.首先,看看下面的XML文件: hello xyz abc def 考虑一下我正在解析上面的文件.现在,我的问题是我想为名称和地址创建 ...

  3. linux中如何分割字符串数组中,关于bash:linux shell脚本:拆分字符串,将它们放入一个数组中,然后循环遍历它们...

    本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: Split string based on delimiter in Bash? 在bash脚本中,如何使用像;这样的分 ...

  4. linux中如何分割字符串数组中,[转+整理]linux shell 将字符串分割成数组

    "传成老树白茶"献礼母亲节 邀市民品茗感受茶文化 5月8日下午,传成老树白茶巡回中国公益品鉴会第七十站,走进福州马尾区东方名城传成老树白茶文化馆. 本次品鉴会活动以 ...

  5. 用js:字符串数组中每一项的长度。将字符串数组用 | 符号分割。有序数组插入排序插入数组。猴子选大王

    1.字符串数组中每一项的长度 代码: <script> var arr = ['hello', 'world!', 'nice', 'to', 'meet', 'you'];var new ...

  6. 求行指针所指的字符串数组中长度最长的字符串所在的行下标

    <程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p137 习题5 3.行指针ss所指字符串数组中共有M个字符串,且字符串长度<N.求ss所指字符串 ...

  7. 使用C#删除一个字符串数组中的空字符串

    C#中要如何才能删除一个字符串数组中的空字符串呢?随着微软对C#不断发展和更新,C#中对于数组操作的方式也变得越来越多样化.以往要实现过滤数组中的空字符串,都是需要实行循环的方式来排除和过滤.C#3. ...

  8. 20190501-编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串...

    题目描述 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow ...

  9. 从字符串数组中寻找数字的元素

    前几天Insus.NET有写过一篇<从字符串数组中把数字的元素找出来>http://www.cnblogs.com/insus/p/8001026.html 和它的延伸篇<C# yi ...

最新文章

  1. Win7+Ubuntu双系统,如何卸载Ubuntu系统?
  2. Java泛型应用详解
  3. Wordpress基础:精简头部wp_head
  4. 【Nginx那些事】nginx 安装及常用指令
  5. asp.net core-5.控制台读取json文件
  6. 【Flink】Flink 消费 kafka报错 写入 es 死信队列 FetchSessionHandler DisconnectException
  7. vim-Complex repeats
  8. 分布式多副本一致性协议:paxos
  9. 机器学习(3)——K-近邻算法改进约会网站的配对效果实例
  10. Leetcode 刷题笔记(二十四) ——动态规划篇之背包问题:01背包
  11. L3MON-远程Android管理套件环境搭建
  12. java实现一码多扫支付_详解JAVA后端实现统一扫码支付:微信篇
  13. 2022年湖南省中医执业医师考试第三单元医学针灸学模拟题
  14. XP系统的的一些快捷方式
  15. Linux - 虚拟网络设备 - bridge,veth,namespace
  16. 山东大学网络靶场实验平台—团队进度(三)
  17. 理查德30多岁开发出C语言,《C语言程序设计》多媒体教学课件开发与应用
  18. 来自一位双非本科跌跌撞撞的秋招指南(秋招攻略/经验分享/干货)
  19. 帝国cms模板如何开启支持php,帝国cms模板使用说明与技巧
  20. 3.9 Docker最新入门教程-Docker入门-构建镜像最佳实践

热门文章

  1. MIL-STD-1553B总线系统搭建指导
  2. 概念篇---Microkernel(微内核)
  3. Qt数据库报表应用-食品小作坊登记证打印系统二
  4. python连续两个冒号是什么成语_python中双冒号
  5. 抖音seo排名优化如何才能有好的效果
  6. 海思高端处理器追上联发科,一线大厂如坐针毡
  7. 9. 用两个栈实现队列
  8. Deepin系统安装教程及无法关机问题解决办法
  9. android极光静默推送,Android 推送 整合小米、个推、jpush
  10. 一个汉字占多少字节?