android分割字符串数组中,Android实现文件的分割和组装

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值