Android文件的分割和组装

原创 2013年12月02日 15:11:52

使用UDP数据包发送文件时,由于UDP数据包大小的限制,一个文件要放在几个UDP数据包里面发送,这就需要把一个文件分割成若干部分,分别放进若干个UDP数据包里面,在接收端,收到这些UDP数据包以后,再对文件进行组装,从而得到一个完整的文件。

定义的相关变量:

1
2
3
4
5
6
7
8
9
10
11
// 要分割的文件
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类实现文件的分割和组装操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 构造函数(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){
 
        }
    }
     
}

分割文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// 分割文件并发送
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){
 
        }
    }
}

合并文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 合并文件
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自身的原因,对大文件(如影视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题。 文件分割后分多次请求服务。 1 //文...
  • jdsjlzx
  • jdsjlzx
  • 2015年02月05日 23:23
  • 9465

Android 文件分割工具

  • 2013年05月21日 09:52
  • 216KB
  • 下载

Android 分割合并文件 assets res/raw 存放资源的限制

写程序的时候想引用外部的apk为自己所用,想在安装自己程序apk的时候一起安装关联的apk,把关联的apk放在 assets目录下面,但是2.3以前的任何压缩资源的原始大小超过1M将不能从APK中...
  • Huaerge
  • Huaerge
  • 2015年12月11日 12:02
  • 1585

Android-汉语词典开发-assets,raw的InputStream数据流操作(文件分割合并)

文件移动 一. 在应用中由于种种原因需要将一些外部文件放在 assets 或者 raw 文件夹内,以便进一步使用。这两个文件夹有以下的区别和联系: 1. 都是以数据流的形式进行读取,从而导致 Ja...

Android下大文件分割上传

由于android自身的原因,对大文件(如影视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题。 文件分割后分多次请求服务。 ...
  • twlkyao
  • twlkyao
  • 2013年05月02日 11:31
  • 859

android 向服务器Get和Post请求的两种方式,android向服务器发送文件,自己组装协议和借助第三方开源

android 向服务器Get和Post请求的两种方式,android向服务器发送文件,自己组装协议和借助第三方开源...
  • intbird
  • intbird
  • 2014年08月01日 16:27
  • 1821

android培训之android下大文件分割上传(摘自达内总部)

由于android自身的原因,对大文件(如影视频文件)的*作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题。 文件分割后分多次请求服务。  1 //...
  • tyuttjx
  • tyuttjx
  • 2012年08月02日 22:55
  • 4351

Android中资源文件夹res/raw和assets的使用(续)——分割文件以及合并文件

上次说到Android中资源文件夹res/raw和assets的使用,但是在读取这两个资源文件夹中的文件时会有一定的限制,即单个文件大小不能超过1M,如果读取超过1M的文件会报"Data exceed...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android文件的分割和组装
举报原因:
原因补充:

(最多只允许输入30个字)