使用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文件的分割和组装的更多相关文章

  1. [转]Android - 文件读写操作 总结

     转自:http://blog.csdn.net/ztp800201/article/details/7322110 Android - 文件读写操作 总结 分类: Android2012-03-05 ...

  2. Android 文件夹命名规范 国际化资源

    Android 文件夹命名规范 国际化资源 android多国语言文件夹文件汇总如下: 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values- ...

  3. Android——文件的保存和读取

    Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中.可以使用Context ...

  4. Android 文件的选择

    Android 文件的选择 打开文件选择器 private void showFileChooser() { Intent intent = new Intent(Intent.ACTION_GET_ ...

  5. Android文件选择器的实例分享

    本文给大家讲解下Android文件选择器的使用.实际上就是获取用户在SD卡中选择的文件或文件夹的路径,这很像C#中的OpenFileDialog控件. 此实例的实现过程很简单,这样可以让大家快速的熟悉 ...

  6. Android开发进阶:如何读写Android文件

    Android主要有四大主要组件组成:Activity.ContentProvider.Service.Intent组成.Android文件的运行主要需要读写四大组件的文件.本文将介绍如何读写Andr ...

  7. android 文件操作类简易总结

    android 文件操作类(参考链接) http://www.cnblogs.com/menlsh/archive/2013/04/02/2997084.html package com.androi ...

  8. 判断android文件是否加壳

    判断android文件是否加壳 查看文件是否有多个进程 反编译文件class.dex,看文件结构 查看文件特征,libsecexe libsecmain等 反编译so文件,看函数是否加密

  9. Linux之文件过滤分割与合并

    文件过滤分割与合并 1.grep命令 grep(global regular expression print)全面搜索正则表达式并把行打印出来,是一种强大的文本搜索工具,它能使用正则表达式搜索文本, ...

随机推荐

  1. C# 对包含文件或目录路径信息的 System.String 实例执行操作

    在字符串操作中有一类比较特殊的操作,就是对包含文件或目录路径信息的 System.String 实例执行操作.比如根据一个表示路径的字符串获取其代表的文件名称.文件夹路径.文件扩展名等.在很多时候,我 ...

  2. jetty

    相关的文章太多了,我只按照自己的意思做简单总结. 参见: http://www.cnblogs.com/duanxz/p/3154982.html http://www.cnblogs.com/win ...

  3. PDO预处理

    方法:bool PDOStatement::execute ([ array $input_parameters ] ) 1.PDOStatement::execute不使用参数 01)单个绑定值(P ...

  4. Java程序员的日常—— 基于类的策略模式、List<?>与List、泛型编译警告、同比和环比

    早晨起得太早,昨晚睡得太晚,一天都迷迷糊糊的.中午虽然睡了半个小时,可是依然没有缓过来.整个下午都在混沌中....不过今天下载了一款手游--<剑侠情缘>,感觉不错,喜欢这种类型的游戏. 今 ...

  5. 无服务端纯前台导出数据到Excel-JSExcelXML.js 使用指南

    JSExcelXML 使用指南 先来个效果预览 a.前端显示 b.导出excel效果 表头部分 表尾部分 1.功能描述 JsExcelXml 采用js生成excel中可显示的xml格式文本,将输出文本 ...

  6. Html5+asp.net mvc 图片压缩上传

    在做图片上传时,大图片如果没有压缩直接上传时间会非常长,因为有的图片太大,传到服务器上再压缩太慢了,而且损耗流量. 思路是将图片抽样显示在canvas上,然后用通过canvas.toDataURL方法 ...

  7. Javascript快速入门(下篇)

    Javascript, cheer up. Ajax:其通过在Web页面与服务器之间建立一个额外的处理层,这个处理层就被称为Ajax引擎,它解释来自用户的请求,在后台以异步的方式处理服务器通信,其结构 ...

  8. AJAX大文件切割上传以及带进度条。

    分块传输的原理就是利用HTML5新增的文件slice截取函数. 代码如下: html: <input id="f" type="file" name=&q ...

  9. Python函数参数默认值的陷阱和原理深究"

    本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

  10. 【Android】学习记录<1> -- 初识ffmpeg

    工作需要用到ffmpeg来进行Android的软编码,对这玩意儿一点都不了解,做个学习记录先. FFmpeg:http://www.ffmpeg.org Fmpeg is the leading mu ...