Android文件的分割和组装
使用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 - 文件读写操作 总结
转自:http://blog.csdn.net/ztp800201/article/details/7322110 Android - 文件读写操作 总结 分类: Android2012-03-05 ...
- Android 文件夹命名规范 国际化资源
Android 文件夹命名规范 国际化资源 android多国语言文件夹文件汇总如下: 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values- ...
- Android——文件的保存和读取
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中.可以使用Context ...
- Android 文件的选择
Android 文件的选择 打开文件选择器 private void showFileChooser() { Intent intent = new Intent(Intent.ACTION_GET_ ...
- Android文件选择器的实例分享
本文给大家讲解下Android文件选择器的使用.实际上就是获取用户在SD卡中选择的文件或文件夹的路径,这很像C#中的OpenFileDialog控件. 此实例的实现过程很简单,这样可以让大家快速的熟悉 ...
- Android开发进阶:如何读写Android文件
Android主要有四大主要组件组成:Activity.ContentProvider.Service.Intent组成.Android文件的运行主要需要读写四大组件的文件.本文将介绍如何读写Andr ...
- android 文件操作类简易总结
android 文件操作类(参考链接) http://www.cnblogs.com/menlsh/archive/2013/04/02/2997084.html package com.androi ...
- 判断android文件是否加壳
判断android文件是否加壳 查看文件是否有多个进程 反编译文件class.dex,看文件结构 查看文件特征,libsecexe libsecmain等 反编译so文件,看函数是否加密
- Linux之文件过滤分割与合并
文件过滤分割与合并 1.grep命令 grep(global regular expression print)全面搜索正则表达式并把行打印出来,是一种强大的文本搜索工具,它能使用正则表达式搜索文本, ...
随机推荐
- WebApi系列~QQ互联的引入(QConnectSDK)
回到目录 感谢与改进 首先要感谢张善友老兄为大家封装的这个DLL,它将QQ官方的相关API都集成到了这个里面,这对于开发人员来说,是个福音,有人会说,为什么QQ官方没有提供.net版的SDK呢,在这里 ...
- Atitit 作用域的理解attilax总结
Atitit 作用域的理解attilax总结 1.1. 作用域是指对某一变量和方法具有访问权限的代码空间, 1 1.2. 作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突.1 1.3 ...
- Atitit。木马病毒原理机密与概论以及防御
Atitit.木马病毒原理机密与概论以及防御 1. 定时截屏木马1 1.1. QQ聊天与微信聊天木马1 2. 文档木马1 3. 病毒木马的触发方式2 4. 远程木马2 5. 漏洞木马2 6. 病毒木马 ...
- js的基本语句和语法
字符串赋值:把字符串用双引号或单引号引起来,在(js.php)中:二.类型转换;parseint():转整数.parsefloat转小数:强制转换三.运算符表达式1数序运算:加减乘除 %取余:2逻 ...
- IDE:Eclipse查看Servlet源码
一.源码下载 1.打开tomcat官网:http://tomcat.apache.org/ , 点击右侧下载菜单(以tomcat-7为例)进入下载页面:http://tomcat.apache. ...
- echart饼状图使用,打发时间。
新公司,刚来几天,闲着没事,领导让我做些无关痛痒的活,优化报表统计!!!之前是用flash做的,现在要改成echart实现.好吧,之前没用过,抱着学习态度,研究了下.写点东西打发下时间,能帮到需要帮助 ...
- 快速入门系列--WebAPI--03框架你值得拥有
接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI ...
- jS事件之网站常用效果汇总
下拉菜单 <!--简单的设置了样式,方便起见,将style和script写到同一个文档,着重练习事件基础--> <!DOCTYPE html> <html> < ...
- valueOf()方法
前面的话 关于类型转换,对象常见的两个方法是toString()和valueOf().实际上,这两个方法也可以应用在包装类型上.前面已经介绍过toString()方法,本文将介绍valueOf()方法 ...
- Microsoft Naive Bayes 算法——三国人物身份划分
Microsoft朴素贝叶斯是SSAS中最简单的算法,通常用作理解数据基本分组的起点.这类处理的一般特征就是分类.这个算法之所以称为“朴素”,是因为所有属性的重要性是一样的,没有谁比谁更高.贝叶斯之名 ...