最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android 大文件切割與合并的實(shí)現(xiàn)代碼

 更新時間:2018年11月13日 08:24:58   作者:_亻弋_石馬_亻_生  
這篇文章主要介紹了Android 大文件切割與合并,實(shí)現(xiàn)了很多發(fā)文件和視頻的切割,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言:

由于公司的業(yè)務(wù),硬生生的把ios開發(fā)的我,掰成了android!關(guān)于上傳文件的需求處理,做了一個Java的簡單封裝 DocumentManagement 。其中集成了,檢測文件,MD5加密,Base64加密/解碼,針對文件Base64加密處理,獲取文件后戳,切割文件,合并文件等方法。

親測可切割與合并有效:視頻、mp3、jpg、apk!還有很多沒測,講道理應(yīng)該是都可以的。合并效果如圖:

好了不扯皮了,直接上代碼!注:以下代碼僅供參考,如有想法請留言告知 DocumentManagement 使用方法如下:

//文件
              File file = new File(strPath);

              documentManagement.log("開始——汪汪汪汪");
              //切割文件
              documentManagement.getSplitFile(file,1*1024*1024 );

              //合并文件
              String merFileName = "gsplay";//自定義合并文件名字
              //創(chuàng)建合并文件路徑
              String filePath = Environment.getExternalStorageDirectory().getPath()+"/"+merFileName;

              documentManagement.merge(filePath,file,1*1024*1024);
              documentManagement.log("結(jié)束——汪汪汪汪");

Java獲取文件后綴

/**
   * 獲取文件后綴名 例如:.mp4 /.jpg /.apk
   * @param file 指定文件
   * @return String 文件后綴名
   */
  public static String suffixName (File file){
    String fileName=file.getName();
    String fileTyle=fileName.substring(fileName.lastIndexOf("."),fileName.length());
    return fileTyle;
  }

文件按設(shè)定的大小進(jìn)行切割

/**
   * 文件分割方法
   * @param targetFile 分割的文件
   * @param cutSize 分割文件的大小
   * @return int 文件切割的個數(shù)
   */
  public static int getSplitFile(File targetFile ,long cutSize ) {

    //計算切割文件大小
    int count = targetFile.length() % cutSize == 0 ? (int) (targetFile.length() / cutSize) :
        (int) (targetFile.length() / cutSize + 1);

    RandomAccessFile raf = null;
    try {
      //獲取目標(biāo)文件 預(yù)分配文件所占的空間 在磁盤中創(chuàng)建一個指定大小的文件  r 是只讀
      raf = new RandomAccessFile(targetFile, "r");
      long length = raf.length();//文件的總長度
      long maxSize = length / count;//文件切片后的長度
      long offSet = 0L;//初始化偏移量

      for (int i = 0; i < count - 1; i++) { //最后一片單獨(dú)處理
        long begin = offSet;
        long end = (i + 1) * maxSize;
        offSet = getWrite(targetFile.getAbsolutePath(), i, begin, end);
      }
      if (length - offSet > 0) {
        getWrite(targetFile.getAbsolutePath(), count-1, offSet, length);
      }

    } catch (FileNotFoundException e) {
//      System.out.println("沒有找到文件");
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        raf.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return count;
  }
  /**
   * 指定文件每一份的邊界,寫入不同文件中
   * @param file 源文件地址
   * @param index 源文件的順序標(biāo)識
   * @param begin 開始指針的位置
   * @param end 結(jié)束指針的位置
   * @return long
   */
  public static long getWrite(String file,int index,long begin,long end ){

    long endPointer = 0L;

    String a=file.split(suffixName(new File(file)))[0];

    try {
      //申明文件切割后的文件磁盤
      RandomAccessFile in = new RandomAccessFile(new File(file), "r");
      //定義一個可讀,可寫的文件并且后綴名為.tmp的二進(jìn)制文件
      //讀取切片文件
      File mFile = new File(a + "_" + index + ".tmp");
      //如果存在
      if (!isFileExist(mFile)) {
        RandomAccessFile out = new RandomAccessFile(mFile, "rw");
        //申明具體每一文件的字節(jié)數(shù)組
        byte[] b = new byte[1024];
        int n = 0;
        //從指定位置讀取文件字節(jié)流
        in.seek(begin);
        //判斷文件流讀取的邊界
        while ((n = in.read(b)) != -1 && in.getFilePointer() <= end) {
          //從指定每一份文件的范圍,寫入不同的文件
          out.write(b, 0, n);
        }

        //定義當(dāng)前讀取文件的指針
        endPointer = in.getFilePointer();
        //關(guān)閉輸入流
        in.close();
        //關(guān)閉輸出流
        out.close();
      }else {
        //不存在

      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    return endPointer - 1024;
  }

文件合并

/**
   * 文件合并
   * @param fileName 指定合并文件
   * @param targetFile 分割前的文件
   * @param cutSize 分割文件的大小
   */
  public static void merge(String fileName,File targetFile ,long cutSize) {


    int tempCount = targetFile.length() % cutSize == 0 ? (int) (targetFile.length() / cutSize) :
        (int) (targetFile.length() / cutSize + 1);
    //文件名
    String a=targetFile.getAbsolutePath().split(suffixName(targetFile))[0];

    RandomAccessFile raf = null;
    try {
      //申明隨機(jī)讀取文件RandomAccessFile
      raf = new RandomAccessFile(new File(fileName+suffixName(targetFile)), "rw");
      //開始合并文件,對應(yīng)切片的二進(jìn)制文件
      for (int i = 0; i < tempCount; i++) {
        //讀取切片文件
        File mFile = new File(a + "_" + i + ".tmp");
        //
        RandomAccessFile reader = new RandomAccessFile(mFile, "r");
        byte[] b = new byte[1024];
        int n = 0;
         //先讀后寫
         while ((n = reader.read(b)) != -1) {//讀
           raf.write(b, 0, n);//寫
         }
         //合并后刪除文件
        isDeleteFile(mFile);
         //日志
        log(mFile.toString());
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        raf.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

DocumentManagement_Dome_Git下載地址

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

梨树县| 鹿泉市| 张北县| 保山市| 胶州市| 潞城市| 错那县| 昭平县| 武隆县| 开江县| 阿拉善盟| 永丰县| 河源市| 闸北区| 紫阳县| 余姚市| 昭觉县| 邢台县| 佳木斯市| 赤城县| 鄱阳县| 宽甸| 大英县| 五河县| 攀枝花市| 株洲县| 博爱县| 靖西县| 息烽县| 浑源县| 印江| 外汇| 东光县| 科技| 和硕县| 海淀区| 塘沽区| 深州市| 特克斯县| 阿克苏市| 迁安市|