我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java实现文件的分割与合并

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java实现文件的分割与合并

本文实例为大家分享了Java实现文件的分割与合并的具体代码,供大家参考,具体内容如下

一、文件分割实现思想

1、设置分割文件(块)的大小;
2、通过输入流获取源文件的大小;
3、根据1、2步的计算结果计算出分割后的文件个数(源文件的大小 / 设置分割文件的大小 ,如果设置的文件大小大于源文件的大小,接下来判断1、2步计算结果,如果余数为0,则文件个数为商值,如果余数大于0,则文件个数为商值加1。
如果设置分割文件的大小小于源文件的大小,那么文件个数为1。);
4、分割文件(边读边写)。

二、文件合并实现思想

1、文件合并与文件分割实现思想的第4步类似,就是边读边写。

方式一:调用API中的RandomAccessFile,此类的实例支持对随机存取文件的读取和写入。按块分割与合并,示例代码如下:


package com.cn.filesplite1;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
 
public class SplitFile {
 //文件的路径
 private String filePath;
 //文件名
 private String fileName;
 //文件大小
 private long length;
 //块数
 private int size;
 //每块的大小
 private long blockSize;
 //分割后的存放目录
 private String destBlockPath;
 //每块的名称
 private List<String> blockPath;
 
 public SplitFile(){
  blockPath = new ArrayList<String>();
 }
 public SplitFile(String filePath,String destBlockPath){
  this(filePath,destBlockPath,1024);  
 }
 public SplitFile(String filePath,String destBlockPath,long blockSize){
  this();
  this.filePath= filePath;
  this.destBlockPath =destBlockPath;
  this.blockSize=blockSize;
  init();
 }
 
 
 public void init(){
  File class="lazy" data-src =null;
  //健壮性
  if(null==filePath ||!(((class="lazy" data-src=new File(filePath)).exists()))){
   return;
  }
  if(class="lazy" data-src.isDirectory()){
   return ;
  }
  //文件名
  this.fileName =class="lazy" data-src.getName();
  
  //计算块数 实际大小 与每块大小
  this.length = class="lazy" data-src.length();
  //修正 每块大小
  if(this.blockSize>length){
   this.blockSize =length;
  }
  //确定块数  
  size= (int)(Math.ceil(length*1.0/this.blockSize));
  //确定文件的路径
  initPathName();
 }
 
 private void initPathName(){
  for(int i=0;i<size;i++){
   this.blockPath.add(destBlockPath+"/"+this.fileName+".part"+i);
  }
 }
 
 
 public void split(){ 
  long beginPos =0;  //起始点
  long actualBlockSize =blockSize; //实际大小  
  //计算所有块的大小、位置、索引
  for(int i=0;i<size;i++){
   if(i==size-1){ //最后一块
    actualBlockSize =this.length-beginPos;
   }   
   spiltDetail(i,beginPos,actualBlockSize);
   beginPos+=actualBlockSize; //本次的终点,下一次的起点
  }
  
 }
 
 private void spiltDetail(int idx,long beginPos,long actualBlockSize){
  //1、创建源
  File class="lazy" data-src = new File(this.filePath);  //源文件
  File dest = new File(this.blockPath.get(idx)); //目标文件
  //2、选择流
  RandomAccessFile raf = null;  //输入流
  BufferedOutputStream bos=null; //输出流
  try {
   raf=new RandomAccessFile(class="lazy" data-src,"r");
   bos =new BufferedOutputStream(new FileOutputStream(dest));
   //读取文件
   raf.seek(beginPos);
   //缓冲区
   byte[] flush = new byte[1024];
   //接收长度
   int len =0;
   while(-1!=(len=raf.read(flush))){    
    if(actualBlockSize-len>=0){ //查看是否足够
     //写出
     bos.write(flush, 0, len);
     actualBlockSize-=len; //剩余量
    }else{ //写出最后一次的剩余量
     bos.write(flush, 0, (int)actualBlockSize);
     break;
    }
   }
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }finally{
   FileUtil.close(bos,raf);
  }
 }
 
 public void merge(String destPath){
  //创建源
  File dest =new File(destPath);
  //选择流
  BufferedOutputStream bos=null; //输出流
  SequenceInputStream sis =null ;//输入流
  //创建一个容器
  Vector<InputStream> vi = new Vector<InputStream>();  
  try {
   for (int i = 0; i < this.blockPath.size(); i++) {
    vi.add(new BufferedInputStream(new FileInputStream(new File(this.blockPath.get(i)))));
   } 
   bos =new BufferedOutputStream(new FileOutputStream(dest,true)); //追加
   sis=new SequenceInputStream(vi.elements());   
   //缓冲区
   byte[] flush = new byte[1024];
   //接收长度
   int len =0;
   while(-1!=(len=sis.read(flush))){      
    bos.write(flush, 0, len);
   }
   bos.flush();
   FileUtil.close(sis);
  } catch (Exception e) {
  }finally{
   FileUtil.close(bos);
  }  
 }
 
 public static void main(String[] args) {
  //1024 * 30 表示按照每块30Kb大小分割
  SplitFile split = new SplitFile("F:/123/1234/logFile.txt","F:/123/",1024 * 30);
  
  System.out.println(split.size);
  
//  split.split();
  
  split.merge("F:/123/logFile.txt");
  
 }
 
}

package com.cn.filesplite1;
import java.io.Closeable;
public class FileUtil {
 
 public static void close(Closeable ... io){
  for(Closeable temp:io){
   try {
    if (null != temp) {
     temp.close();
    }
   } catch (Exception e) {
   }
  }
  
 }
 
 public static <T extends Closeable> void closeAll(T ... io){
  for(Closeable temp:io){
   try {
    if (null != temp) {
     temp.close();
    }
   } catch (Exception e) {
   }
  }
 }
 
}

方式二:用读写的方式实现文件的分割与合并,具体实现如下代码所示:

定义一个抽象类


package com.cn.filesplite2;
import java.io.File;
import java.io.IOException;

public abstract class SplitFile {
 
 public static long MAX_BYTE = 1024 * 1024 * 1024 * 2L;  //2G
 
 
 public abstract int getSplitFileNum(long fileByte,String fileParh);
 
 public abstract long getFileLength(File file) ;
 
 public abstract String[] splitFile (File class="lazy" data-srcFile,int splitFileNum) throws IOException;
 
 public abstract void mergeFile(String[] files,String newFile) throws IOException;
 
}

实现类


package com.cn.filesplite2;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class SplitTextFile extends SplitFile{
 
 @Override
 public long getFileLength(File file) {
  FileReader fr =  null;
  BufferedReader br = null;
  //文件大小
  long fileSize = 0;
  try {
   fr = new FileReader(file);
   br = new BufferedReader(fr);
   String line = br.readLine();
   //按行读取文件
   while(line != null){
    //计算文件大小
    fileSize += line.length();
    line = br.readLine();
   }
  } catch (IOException e) {
   e.printStackTrace();
  }finally{
   //关闭输入流
   try {
    if(br != null){
     br.close();
    }
    if(fr != null){
     fr.close();
    }
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  //返回文件大小
  return fileSize;
 }
 
 @Override
 public int getSplitFileNum(long fileByte,String fileParh){
  fileByte = getFileLength(new File(fileParh));
  if(MAX_BYTE < fileByte){
   if(fileByte % MAX_BYTE == 0){
    return (int) (fileByte/MAX_BYTE);
   }else{
    return (int) (fileByte/MAX_BYTE) + 1;
   }
  }
  return 1;
 }
 
 @Override
 public String[] splitFile(File class="lazy" data-srcFile, int splitFileNum) throws IOException {
  splitFileNum = getSplitFileNum(getFileLength(class="lazy" data-srcFile), class="lazy" data-srcFile.toString());
  if(splitFileNum <= 0){
   return null;
  }
  FileReader fr = null;
  BufferedReader br = null;
  long readNum = 0;
  String[] splits = new String[splitFileNum];
  try {
   fr = new FileReader(class="lazy" data-srcFile);
   br = new BufferedReader(fr);
   int i = 0;
   while(splitFileNum > i){
    //分割后的文件名
    String name = null;
    //文件后缀
    String nameLast = null;
    if(class="lazy" data-srcFile.getName().indexOf(".") != -1){
     name = class="lazy" data-srcFile.getName().substring(0, class="lazy" data-srcFile.getName().indexOf("."));
     int last = class="lazy" data-srcFile.getName().lastIndexOf(".");
//     System.out.println(i);
//     String string = str.substring(i);
     nameLast = class="lazy" data-srcFile.getName().substring(last);
     
    }else{
     name = class="lazy" data-srcFile.getName();
    }
    splits[i] = class="lazy" data-srcFile.getParent() + "/" + name + "_" + i + nameLast;
    File wfile = new File(splits[i]);
    if(!wfile.exists()){
     wfile.getParentFile().mkdirs();
     wfile.createNewFile();
    }
    FileWriter fw = new FileWriter(wfile,false);
    BufferedWriter bw = new BufferedWriter(fw);
    String line = br.readLine();
    int flush = 0;
    while(line != null){
     if(line.trim().length() == 0){
      line = br.readLine();
      continue;
     }
     readNum += line.length();
     if(i + 1 == splitFileNum){
      bw.write(line);
      bw.newLine();
     }else{
      if(readNum >= MAX_BYTE){
       bw.write(line);
       bw.newLine();
       break;
      }else{
       bw.write(line);
       bw.newLine();
      }
     }
     line = br.readLine();
     if(flush % 100 == 0){
      bw.flush();
     }
    }
    bw.flush();
    fw.flush();
    bw.close();
    fw.close();
    readNum = 0;
    i++;
   }
  } catch (RuntimeException e) {
   e.printStackTrace();
  }
  finally{
   try {
    if(br != null) br.close();
    if(fr != null) fr.close();
   } catch (Exception e) {
    e.printStackTrace();
   }finally{
    br = null;
    fr = null;
   }
  }
  return splits;
 }
 
 @Override
 public void mergeFile(String[] files, String newFile) throws IOException {
  File wfile = new File(newFile);
  FileWriter writer = null;
  BufferedWriter bufferedWriter = null;
  try {
   writer = new FileWriter(wfile,false);
   bufferedWriter = new BufferedWriter(writer);
   for(int i = 0; i < files.length; i++){
    File rFile = new File(files[i]);
    FileReader reader =  new FileReader(rFile);
    BufferedReader bufferedReader = new BufferedReader(reader);
    String line = bufferedReader.readLine();
    while(line != null){
     if(line.trim().length() == 0){
      line = bufferedReader.readLine();
      continue;
     }
     bufferedWriter.write(line);
     bufferedWriter.newLine();
     line = bufferedReader.readLine();
    }
   }
   bufferedWriter.flush();
   writer.flush();
  } catch (Exception e) {
   e.printStackTrace();
  }finally{
   if(bufferedWriter != null)
    bufferedWriter.close();
   bufferedWriter = null;
   if(writer != null)
    writer.close();
   writer = null;
  }
 }
}

测试类


package com.cn.filesplite2;
 
import java.io.File;
import java.io.IOException;
import org.junit.Test;
 
public class TestSplitFile {
 SplitTextFile splitTextFile = new SplitTextFile();
 @Test
 public void funSplitFile() throws IOException{
  String class="lazy" data-srcPath = "E:/splitfile/splitfile.txt"; 
  File file = new File(class="lazy" data-srcPath);
  long fileLength = splitTextFile.getFileLength(file);
  System.out.println("文件大小:" + fileLength);
  int partitionFileNum = splitTextFile.getSplitFileNum(fileLength, class="lazy" data-srcPath);
  System.out.println("个数" + partitionFileNum);
  //文件分割
  splitTextFile.splitFile(new File(class="lazy" data-srcPath), partitionFileNum);
 }
 
 @Test
 public void funMergeFile() throws IOException{
  
  String[] files = {"E:/splitfile/splitfile0",
      "E:/splitfile/splitfile1",
      "E:/splitfile/splitfile2"
//      ...files/
      };
  String newFile = "E:/splitfile/newmergefile";
  splitTextFile.mergeFile(files, newFile);
  
 }
}

以上内容如有任何问题或错误,恳请大家能给予意见,我会及时更正,谢谢大家。

本文的全部内容介绍完了,希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java实现文件的分割与合并

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Linux文件分割与合并怎么实现

这篇文章主要介绍“Linux文件分割与合并怎么实现”,在日常操作中,相信很多人在Linux文件分割与合并怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux文件分割与合并怎么实现”的疑惑有所帮助!
2023-06-16

Java实现大文件的分割与合并的方法详解

这篇文章主要为大家详细介绍了如何利用Java语言实现大文件的分割与合并,以及分割后又再次合并操作,文中示例代码讲解详细,感兴趣的可以了解一下
2022-11-13

CentOS文件分割与合并的命令

这篇文章主要讲解了“CentOS文件分割与合并的命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CentOS文件分割与合并的命令”吧!split命令的语法如下:split [--help]
2023-06-10

怎么用vbs分割与合并文本文件

这篇文章主要为大家展示了“怎么用vbs分割与合并文本文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么用vbs分割与合并文本文件”这篇文章吧。然而想到其他地方再次下载时发现一次性导入几万个地
2023-06-08

C#实现文件分割和合并的示例详解

这篇文章主要为大家详细介绍了如何利用C#实现文件分割和合并的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
2022-12-26

Python 视频文件的分割和合并

import os;import time;os.system('start "wmplayer.exe", "F:\\abc.mp4"');--分割代码 start----import sys,os;kilobytes = 1024;me
2023-01-31

java 流操作对文件的分割和合并的实例详解

java 流操作对文件的分割和合并的实例详解学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并。 下面是代码:package com.dufy.file; import java.io.File; import java
2023-05-31

利用java 怎么对文件进行切割与合并

利用java 怎么对文件进行切割与合并?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、切割文件代码如下:需求:将一个媒体文件切割成多个碎片(每个碎片的大小为1M),并添加
2023-05-31

Java怎么实现PDF文件的分割与加密功能

本篇内容主要讲解“Java怎么实现PDF文件的分割与加密功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么实现PDF文件的分割与加密功能”吧!加密文件/** * 加密文件测试
2023-06-30

python的​PyPDF2怎么实现pdf文件切割和合并

这篇文章将为大家详细讲解有关python的PyPDF2怎么实现pdf文件切割和合并,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在百度了一番后,发现大多都是使用 Adobe Acrobat 软件进行剪裁,
2023-06-29

python与php实现分割文件代码

前两天有个朋友说,想实现一个文本文件按照固定行数进行分割成多个文本文件,却不知如何实现。如果数据量小手动分割下就好了,如果数据量很大的话手动完成实在太耗费人力了,也不现实。那么就需要借助脚本去实现。既然有朋友想简单的完成这个任务,那么不如记
2022-06-04

Linux下如何切割与合并大文件

我们传输一个大文件时,有时网络比较慢,需要花费很长时间才能传输完成,或者传输的过程中,网络不稳定,有可能导致此次传输失败,针对这种情况,我们可以把大文件切分成小文件,再逐个的传输到目的地,最后再把它们合并成一个文件

一文教会你如何用 Python 分割合并大文件

使用 Python 的文件读写功能就可以实现文件的分割与合并,设置每个文件的大小,然后读取指定大小的字节就写入一个新文件,接收端依次读取小文件,把读取到的字节按序写入一个文件,就可以完成合并。

Android实现文件的分割和组装

本文以实例形式讲述了Android实现文件的分割和组装的方法,主要是针对UDP数据包进行的分割和组装。分享给大家供大家参考之用。具体方法如下: 一般来说,在使用UDP数据包发送文件时,由于UDP数据包大小的限制,一个文件要放在几个UDP数据
2022-06-06

python实现文本文件合并

python合并文本文件示例代码。 python实现两个文本合并employee文件中记录了工号和姓名cat employee.txt:100 Jason Smith 200 John Doe 300 Sanjay Gupta 400 As
2022-06-04

如何在 Linux下优雅的进行大文件切割与合并

往往是因为网络传输的限制,导致很多时候,我们需要在 Linux 系统下进行大文件的切割。这样将一个大文件切割成为多个小文件,进行传输,传输完毕之后进行合并即可。

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录