本文以實例形式講述了Android實現文件的分割和組裝的方法,主要是針對UDP數據包進行的分割和組裝。分享給大家供大家參考之用。具體方法如下:
一般來說,在使用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
|
// 構造函數(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
|
// 合并文件 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程序設計有一定的借鑒價值。