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

 更新时间:2018年11月13日 08:24:58   作者:_亻弋_石马_亻_生  
这篇文章主要介绍了Android 大文件切割与合并,实现了很多发文件和视频的切割,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

前言:

由于公司的业务,硬生生的把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下载地址

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

相关文章

  • Android手机联系人快速索引(手机通讯录)

    Android手机联系人快速索引(手机通讯录)

    最近需要实现一个手机通讯录的快速索引功能。根据姓名首字母快速索引功能,下面通过本篇文章给大家介绍Android手机联系人快速索引(手机通讯录)的相关代码,需要的朋友参考下
    2015-12-12
  • android自动生成dimens适配文件的图文教程详解(无需Java工具类)

    android自动生成dimens适配文件的图文教程详解(无需Java工具类)

    这篇文章主要介绍了android自动生成dimens适配文件,无需Java工具类,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Android 开发之dataBinding与ListView及事件

    Android 开发之dataBinding与ListView及事件

    这篇文章主要介绍了Android 开发之dataBinding与ListView及事件的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • Flutter 底部弹窗ModelBottomSheet的使用示例

    Flutter 底部弹窗ModelBottomSheet的使用示例

    在实际开发过程中,经常会用到底部弹窗来进行快捷操作,例如选择一个选项,选择下一步操作等等。在 Flutter 中提供了一个 showModelBottomSheet 方法用于弹出底部弹窗,本篇介绍如何使用底部弹窗。
    2021-06-06
  • Flutter中跨组件数据传递的方法总结

    Flutter中跨组件数据传递的方法总结

    Flutter中的数据传递一般包括:父->子,子->父,父->父,也就是说嵌套时的传递以及跨页面的传递,本文整理了三种我们通常使用的方法,需要的可以参考一下
    2023-06-06
  • Android仿新浪微博个人信息界面及其他效果

    Android仿新浪微博个人信息界面及其他效果

    这篇文章主要为大家详细介绍了Android仿新浪微博个人信息界面及其他效果设计,如正则表达式如何匹配相应表情字段,处理微博发出时间距现在时刻的时间,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android TextView设置不同的颜色字体

    Android TextView设置不同的颜色字体

    这篇文章主要为大家详细介绍了Android TextView设置不同的颜色字体,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 浅谈Android invalidate 分析

    浅谈Android invalidate 分析

    本篇文章主要介绍了浅谈Android invalidate 分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Android实现全局悬浮框

    Android实现全局悬浮框

    这篇文章主要为大家详细介绍了Android实现全局悬浮框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • Android中使用Gson解析JSON数据的两种方法

    Android中使用Gson解析JSON数据的两种方法

    Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下
    2012-12-12

最新评论