欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android實(shí)現(xiàn)文件的分割和組裝

 更新時(shí)間:2014年09月03日 10:57:16   投稿:shichen2014  
這篇文章主要介紹了Android實(shí)現(xiàn)文件的分割和組裝,針對UDP大數(shù)據(jù)包的分割傳輸與組裝有著非常實(shí)用的價(jià)值,需要的朋友可以參考下

本文以實(shí)例形式講述了Android實(shí)現(xiàn)文件的分割和組裝的方法,主要是針對UDP數(shù)據(jù)包進(jìn)行的分割和組裝。分享給大家供大家參考之用。具體方法如下:

一般來說,在使用UDP數(shù)據(jù)包發(fā)送文件時(shí),由于UDP數(shù)據(jù)包大小的限制,一個(gè)文件要放在幾個(gè)UDP數(shù)據(jù)包里面發(fā)送,這就需要把一個(gè)文件分割成若干部分,分別放進(jìn)若干個(gè)UDP數(shù)據(jù)包里面,在接收端,收到這些UDP數(shù)據(jù)包以后,再對文件進(jìn)行組裝,從而得到一個(gè)完整的文件。步驟如下:

一、定義的相關(guān)變量:

// 要分割的文件
public static RandomAccessFile raf_split;
// 要合并的文件
public static RandomAccessFile raf_merge;
// 文件長度
public static long len;
// Byte數(shù)組
public static int offset;
public static int os = 5;
public static int size = 1024-os;
public static byte file_data[] = new byte[1024];

二、FileOperClass類實(shí)現(xiàn)文件的分割和組裝操作:

// 構(gòu)造函數(shù)(0-分割文件,1-合并文件)
public FileOperClass(String file, int x){
   
  // 分割文件
  if (x == 0){    
    try{
      // RandomAccessFile以只讀方式打開文件
      raf_split = new RandomAccessFile(file,"r");
      // 獲得文件大小
      len = raf_split.length();
      // 需要幾個(gè)數(shù)據(jù)包
      pnum = (int) Math.ceil((raf_split.length()*1.0)/(size * 1.0)) + 1;
      // 最后一個(gè)數(shù)據(jù)包里面數(shù)據(jù)多少
      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){
 
    }
  }
}

三、分割文件:

// 分割文件并發(fā)送
public static void split(){
   
  int m1,m2;
   
  p_id = 0;
  offset = 0;
   
  try{
    while (len>0){
      // 數(shù)據(jù)包類型
      file_data[0] = (byte) 2;
      // 客戶端ID
      file_data[1] = (byte) MainActivity.cli_id;
      // 會(huì)話ID
      file_data[2] = (byte) MainActivity.ses_id;
      // 該會(huì)話數(shù)據(jù)包數(shù)量
      file_data[3] = (byte) pnum;
      // 數(shù)據(jù)包ID
      file_data[4] = (byte) p_id;
      // seek
      raf_split.seek(offset);
      // 讀出數(shù)據(jù)到file_data
      raf_split.read(file_data, os, size);
      // 發(fā)送數(shù)據(jù)包
      MainActivity.trd_send.set_action(2, file_data);
      len = len - size; 
      p_id = p_id + 1;
      offset = offset + size; 
    }
    // 記錄最后一個(gè)數(shù)據(jù)包剩余字節(jié)的數(shù)據(jù)包
    // 數(shù)據(jù)包類型
    file_data[0] = (byte) 2;
    // 客戶端ID
    file_data[1] = (byte) MainActivity.cli_id;
    // 會(huì)話ID
    file_data[2] = (byte) MainActivity.ses_id;
    // 該會(huì)話數(shù)據(jù)包數(shù)量
    file_data[3] = (byte) pnum;
    // 數(shù)據(jù)包ID
    file_data[4] = (byte) p_id;
    m1 = pmod / 128;
    m2 = pmod % 128;
    file_data[5] = (byte) m1;
    file_data[6] = (byte) m2;
    // 發(fā)送數(shù)據(jù)包
    MainActivity.trd_send.set_action(2, file_data);     
  }
  catch (Exception e){
 
  }
  finally{
    // 關(guān)閉文件
    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++){        
      // 判斷數(shù)據(jù)包是否已經(jīng)齊全
      if ((MainActivity.r_datapacket.get(i).c_id == MainActivity.mer_cli_id) && (MainActivity.r_datapacket.get(i).ses_id == MainActivity.mer_ses_id))
      {
        // 讀出數(shù)據(jù)包的數(shù)據(jù)進(jìn)byte數(shù)組
        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數(shù)組寫進(jìn)文件
      raf_merge.write(tmp_byte[i], os, size);
    }
    // 最后一個(gè)byte數(shù)組寫進(jìn)文件
    raf_merge.write(tmp_byte[MainActivity.mer_pkt_num-1], os, MainActivity.mer_pkt_mod );
  }
  catch(Exception e){
 
  }
  finally{
    // 關(guān)閉文件
    try{
      raf_merge.close();
    }
    catch(Exception err){
    } 
  }
}

相信本文所述對大家的Android程序設(shè)計(jì)有一定的借鑒價(jià)值。

相關(guān)文章

  • Android底部導(dǎo)航欄的動(dòng)態(tài)替換方案

    Android底部導(dǎo)航欄的動(dòng)態(tài)替換方案

    這篇文章主要為大家詳細(xì)介紹了Android底部導(dǎo)航欄的動(dòng)態(tài)替換方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Android列表RecyclerView排列布局

    Android列表RecyclerView排列布局

    這篇文章主要為大家詳細(xì)介紹了Android列表RecyclerView排列布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • android studio 的下拉菜單Spinner使用詳解

    android studio 的下拉菜單Spinner使用詳解

    這篇文章主要介紹了android studio 的下拉菜單Spinner使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Flutter 路由插件fluro的使用

    Flutter 路由插件fluro的使用

    使用原生的路由基本上能夠滿足大部分需求,但如果想要對頁面做類似瀏覽器 url 那樣的路由,或者控制頁面跳轉(zhuǎn)的轉(zhuǎn)場動(dòng)畫,那么原生的路由需要做不少的改造。在 pub 上,有優(yōu)秀的路由插件 fluro 解決這類問題。本文介紹該插件的使用方法
    2021-06-06
  • Android中EditText 設(shè)置 imeOptions 無效問題的解決方法

    Android中EditText 設(shè)置 imeOptions 無效問題的解決方法

    有時(shí)候我們需要在EditText 輸出完之后 需要在鍵盤出現(xiàn) 右下角變成“Go”或“前往 搜索時(shí);通常我們需要設(shè)置Android:imeOptions屬性,但是今天我發(fā)現(xiàn)設(shè)置了無效,下面給大家分享下解決方案
    2016-12-12
  • Android原生集成RN最新版教程

    Android原生集成RN最新版教程

    這篇文章主要為大家介紹了Android原生集成RN最新版教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android使用動(dòng)畫動(dòng)態(tài)添加商品進(jìn)購物車

    Android使用動(dòng)畫動(dòng)態(tài)添加商品進(jìn)購物車

    這篇文章主要為大家詳細(xì)介紹了Android使用動(dòng)畫動(dòng)態(tài)添加商品進(jìn)購物車,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android不顯示開機(jī)向?qū)Ш烷_機(jī)氣泡問題

    Android不顯示開機(jī)向?qū)Ш烷_機(jī)氣泡問題

    這篇文章主要介紹了Android不顯示開機(jī)向?qū)Ш烷_機(jī)氣泡問題,需要的朋友可以參考下
    2019-05-05
  • Android學(xué)習(xí)筆記之藍(lán)牙功能

    Android學(xué)習(xí)筆記之藍(lán)牙功能

    這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)筆記之藍(lán)牙功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Android 中RxPermissions 的使用方法詳解

    Android 中RxPermissions 的使用方法詳解

    這篇文章主要介紹了Android 中RxPermissions 的使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10

最新評論