java实现文件切片和合并的代码示例

 更新时间:2019年07月18日 11:24:59   作者:诗波烟雨  
这篇文章主要介绍了java实现文件切片和合并的代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

最近在学习大数据相关的知识点,其中需要实现文件的切片和合并,完整的java实现代码,以下贴出个人代码,仅供参考

首先建一个SplitUtil工具类,在工具类中有三个方法getSplitFile,getWrite,merge

1,文件拆分代码 

public static void getSplitFile(String file,int count){
    
    //预分配文件所占用的磁盘空间,在磁盘创建一个指定大小的文件,“r”表示只读,“rw”支持随机读写
    try {
      RandomAccessFile raf = new RandomAccessFile(new File(file), "r");
      //计算文件大小
      long length = raf.length();
      System.out.println(length);
      //计算文件切片后每一份文件的大小
      long maxSize = length / count;
      
      System.out.println(maxSize);
      
      long offset = 0L;//定义初始文件的偏移量(读取进度)
      //开始切割文件
      for(int i = 0; i < count - 1; i++){ //count-1最后一份文件不处理
        //标记初始化
        long fbegin = offset;
        //分割第几份文件
        long fend = (i+1) * maxSize;
        //写入文件
        offset = getWrite(file, i, fbegin, fend);
        
      }
      
      //剩余部分文件写入到最后一份(如果不能平平均分配的时候)
      if (length - offset > 0) {
        //写入文件
        getWrite(file, count-1, offset, length);
      }
      
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    
  }

2,getWrite文件写入代码 

/**
   * 指定文件每一份的边界,写入不同文件中
   * @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;
    try {
      //申明文件切割后的文件磁盘
      RandomAccessFile in = new RandomAccessFile(new File(file), "r");
      //定义一个可读,可写的文件并且后缀名为.tmp的二进制文件
      RandomAccessFile out = new RandomAccessFile(new File(file + "_" + index + ".tmp"), "rw");
      
      //申明具体每一文件的字节数组
      byte[] b = new byte[1024];
      int n = 0;
      //从指定位置读取文件字节流
      in.seek(begin);
      //判断文件流读取的边界
      while(in.getFilePointer() <= end && (n = in.read(b)) != -1){
        //从指定每一份文件的范围,写入不同的文件
        out.write(b, 0, n);
      }
      
      //定义当前读取文件的指针
      endPointer = in.getFilePointer();
      
      //关闭输入流
      in.close();
      //关闭输出流
      out.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
    
    return endPointer;
  }

3.文件合并代码 

/**
   * 文件合并
   * @param file 指定合并文件
   * @param tempFile 分割前的文件名
   * @param tempCount 文件个数
   */
  public static void merge(String file,String tempFile,int tempCount){
    RandomAccessFile raf = null;
    try {
      //申明随机读取文件RandomAccessFile
      raf = new RandomAccessFile(new File(file), "rw");
      //开始合并文件,对应切片的二进制文件
      for (int i = 0; i < tempCount; i++) {
        //读取切片文件
        RandomAccessFile reader = new RandomAccessFile(new File(tempFile + "_" + i + ".tmp"), "r");
        byte[] b = new byte[1024];
        int n = 0;
        while((n = reader.read(b)) != -1){
          raf.write(b, 0, n);//一边读,一边写
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }finally{
      try {
        raf.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }

最后在主程序里面调用就可以了

public static void main(String[] args) {
    
    String file = "F:\\java-study\\img\\mv.jpg";
    int count = 5;
    
    //1.根据现有的文件编写文件编写文件切片工具类
    //2.写入到二进制临时文件
    //  getSplitFile(file, count);
    //3.根据实际的需求合并指定数量的文件
    String tempFile = "F:\\java-study\\img\\img.jpg";
    merge(file, tempFile, 5);
 }

以上代码可实现图片,文档,mp3,mp4等文件的拆分与合并,下面是图片切片和拆分的效果图

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

相关文章

  • SpringBoot整合MongoDB完整实例代码

    SpringBoot整合MongoDB完整实例代码

    本文主要介绍了SpringBoot整合MongoDB完整实例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java NIO实现群聊系统

    Java NIO实现群聊系统

    这篇文章主要为大家详细介绍了Java NIO实现群聊系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • java数据类型与二进制详细介绍

    java数据类型与二进制详细介绍

    这篇文章主要介绍了java数据类型与二进制详细介绍的相关资料,这里对数据类型进行了一一介绍分析,并说明自动转换和强制转换,需要的朋友可以参考下
    2017-07-07
  • 如何通过idea实现springboot集成mybatis

    如何通过idea实现springboot集成mybatis

    这篇文章主要介绍了如何通过idea实现springboot集成mybatis,使用springboot 集成 mybatis后,通过http请求接口,使得通过http请求可以直接操作数据库,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 基于Java 数组内存分配的相关问题

    基于Java 数组内存分配的相关问题

    本篇文章是对Java中数组内存分配进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 关于Java中的dozer对象转换问题

    关于Java中的dozer对象转换问题

    Dozer是Java Bean到Java Bean映射器,它以递归方式将数据从一个对象复制到另一个对象,这篇文章主要介绍了Java中的dozer对象转换的操作方法,需要的朋友可以参考下
    2022-08-08
  • Java并发编程信号量Semapher

    Java并发编程信号量Semapher

    这篇文章主要介绍了Java并发编程信号量Semapher,Semapher信号量也是Java中的一个同步器,下文关于信号量Semapher的更多内容介绍,需要的小伙伴可以参考下面文章
    2022-04-04
  • 持久层ORM框架Hibernate框架的使用及搭建方式

    持久层ORM框架Hibernate框架的使用及搭建方式

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库,本文重点给大家介绍持久层ORM框架Hibernate框架的使用及搭建方式,感兴趣的朋友一起看看吧
    2021-11-11
  • Java实现创建运行时类的对象操作示例

    Java实现创建运行时类的对象操作示例

    这篇文章主要介绍了Java实现创建运行时类的对象操作,结合实例形式分析了Java动态创建对象的原理与相关实现技巧,需要的朋友可以参考下
    2018-08-08
  • SpringBoot源码 PropertySource解析

    SpringBoot源码 PropertySource解析

    PropertySource是spring中对于键值属性的一种抽象,主要是name和sourcePropertyResolver是对PropertySource提供对外的统一数据处理,对于占位符的处理委托于PropertyPlaceholderHelper,对Springboot 源码 PropertySource相关知识感兴趣的朋友一起看看吧
    2023-01-01

最新评论