当前位置: 移动技术网 > IT编程>移动开发>Android > Android 大文件切割与合并的实现代码

Android 大文件切割与合并的实现代码

2019年08月01日  | 移动技术网IT编程  | 我要评论

前言:

由于公司的业务,硬生生的把ios开发的我,掰成了android!关于上传文件的需求处理,做了一个java的简单封装 documentmanagement 。其中集成了,检测文件,md5加密,base64加密/解码,针对文件base64加密处理,获取文件后戳,切割文件,合并文件等方法。

亲测可切割与合并有效:视频、mp3、jpg、apk!还有很多没测,讲道理应该是都可以的。合并效果如图:

好了不扯皮了,直接上代码!注:以下代码仅供参考,如有想法请留言告知 documentmanagement 使用方法如下:

//文件
              file file = new file(strpath);

              documentmanagement.log("开始——汪汪汪汪");
              //切割文件
              documentmanagement.getsplitfile(file,1*1024*1024 );

              //合并文件
              string merfilename = "gsplay";//自定义合并文件名字
              //创建合并文件路径
              string filepath = environment.getexternalstoragedirectory().getpath()+"/"+merfilename;

              documentmanagement.merge(filepath,file,1*1024*1024);
              documentmanagement.log("结束——汪汪汪汪");

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;
  }

文件按设定的大小进行切割

/**
   * 文件分割方法
   * @param targetfile 分割的文件
   * @param cutsize 分割文件的大小
   * @return int 文件切割的个数
   */
  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 {
      //获取目标文件 预分配文件所占的空间 在磁盘中创建一个指定大小的文件  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++) { //最后一片单独处理
        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 源文件的顺序标识
   * @param begin 开始指针的位置
   * @param end 结束指针的位置
   * @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的二进制文件
      //读取切片文件
      file mfile = new file(a + "_" + index + ".tmp");
      //如果存在
      if (!isfileexist(mfile)) {
        randomaccessfile out = new randomaccessfile(mfile, "rw");
        //申明具体每一文件的字节数组
        byte[] b = new byte[1024];
        int n = 0;
        //从指定位置读取文件字节流
        in.seek(begin);
        //判断文件流读取的边界
        while ((n = in.read(b)) != -1 && in.getfilepointer() <= end) {
          //从指定每一份文件的范围,写入不同的文件
          out.write(b, 0, n);
        }

        //定义当前读取文件的指针
        endpointer = in.getfilepointer();
        //关闭输入流
        in.close();
        //关闭输出流
        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 {
      //申明随机读取文件randomaccessfile
      raf = new randomaccessfile(new file(filename+suffixname(targetfile)), "rw");
      //开始合并文件,对应切片的二进制文件
      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下载地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网