一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android實現文件的分割和組裝

Android實現文件的分割和組裝

2021-03-08 14:31Android開發網 Android

這篇文章主要介紹了Android實現文件的分割和組裝,針對UDP大數據包的分割傳輸與組裝有著非常實用的價值,需要的朋友可以參考下

本文以實例形式講述了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程序設計有一定的借鑒價值。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 女女宿舍互慰h文小说 | 亚洲精品在线播放 | 色婷综合 | 性导航h| 欧美一级艳片视频免费观看 | 和肥岳在厨房激情 | 2019国内自拍大神视频 | 思思91精品国产综合在线 | 日本一区二区三区视频在线观看 | 深夜激情网站 | 97影院网| 国产精品合集久久久久青苹果 | 日本不卡一区二区三区在线观看 | 国产精品va在线观看手机版 | 欧美高清乌克兰精品另类 | h动态图男女啪啪27报 | 精品视频在线免费播放 | 男人桶女下面60分钟视频 | 国产情侣露脸自拍 | 国内精品视频免费观看 | www.久久av.com| 99精品视频在线观看re | 羲义嫁密着中出交尾gvg794 | 五月天精品视频播放在线观看 | 日本免费三片在线播放 | 欧美日韩一区二区三区免费 | 俄罗斯一级毛片免费播放 | 国产第一综合另类色区奇米 | 逼水真多 | 亚洲 欧美 国产 综合久久 | 青青操在线| 日本红色高清免费观看 | 操小女人 | gay18高中生白袜xnxx动漫 | 亚洲天堂男人的天堂 | 国产亚洲福利一区二区免费看 | 国产精品igao视频网网址 | 欧美一级片免费在线观看 | 九色PORNY蝌蚪视频首页 | 高清不卡免费一区二区三区 | 日韩精品视频福利资源站 |