一、文件分割示意图

二、文件合并示意图

方式一:通过文件追加的方式

方式二:通过SequenceInputStream对其他输入流的逻辑串联。

测试RandomAccessFile随机访问文件

package FileSplitMerge;import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;import IOOthers.FileUtil;/*** RandomAccessFile* 此类的实例支持对随机访问文件的读取和写入。* * 文件分割的思路* 1、 分割的块数 size   n块* 2、 每一块的大小 blocksize*    最后一块:总的文件大小-(n-1)*blockSize*/public class Demo01 {public static void main(String[] args) throws IOException {RandomAccessFile rnd = new RandomAccessFile(new File("G:/writer.txt"), "r");//UTF-8-->英文使用1个字节,中文使用3个字节来编码//GBK-->每个字符占用2个字节//从第12个读起       这是采用的是UTF-8  rnd.seek(12);//定义缓冲大小byte[] flush = new byte[1024];//接收长度int len=0;while(-1!=(len=rnd.read(flush))){if(len>=48){System.out.println(new String(flush,0,48));}   else {System.out.println(new String(flush,0,len));}}FileUtil.close(rnd);}
}

运行结果:

都有青春,
每个青春都有一个故事�
re ESX资源管理与性能优化
S1.1.11VMware
��FT-Practise
实验演示7:vApp-Practise
�

文件的分割与合并

package FileSplitMerge;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;import IOOthers.FileUtil;@SuppressWarnings("all")
public class SplitFile {//文件的路径private String filePath;//块数private int size;//每块的大小private long blocksize;//文件名private String fileName;//文件大小private long length;//分割后的存放目录private String destBlockPath;//每块的名称private List<String> blockPath;public SplitFile() {blockPath = new ArrayList<String>() ;}   public SplitFile(String filePath,String destBlockPath) {this(filePath,1024, destBlockPath);}public SplitFile(String filePath, long blocksize,String destBlockPath) {this();this.filePath = filePath;this.destBlockPath = destBlockPath;this.blocksize = blocksize;}/*** 初始化操作 计算块数、确定文件名*/public void init(){File src = null;//健壮性    创建成功就会得到构造方法初始化的值if(null==filePath || !(src=new File(filePath)).exists()){return;}if(src.isDirectory()){return;}//文件名    g:/writer.txt的 writer.txtthis.fileName = src.getName(); //文件的大小this.length = src.length();//修正    每块的大小if(this.blocksize>length) //如果每块的大小大于文本的长度,则每块的大小=长度{this.blocksize = length;}//确定块数        ceil最小(最接近负无穷大)浮点值,该值大于等于该参数,并等于某个整数。size = (int) Math.ceil(length*1.0/this.blocksize);//确定文件的路径initPathName();}private void initPathName(){for(int i=0;i<size;i++){//List容器里面增加每一块的路径this.blockPath.add(destBlockPath+"/"+this.fileName+".part"+i);}}/*** 文件分割* 确定在第几块* 1、起始位置* 2、实际大小* @param destPath 分割文件存放目录* @throws IOException */public void split(String destPath) throws IOException{//确定文件的路径//每一块的名称//initPathName(destPath);long beginPos = 0;//起始点long actualBlockSize = blocksize;//实际大小//计算所有快的大小、位置、索引for(int i=0;i<size; i++){if(i == size-1){//最后一块actualBlockSize = this.length-beginPos;}//具体分割方法     第几块    起始分割地址        实际的块大小splitDetail(i,beginPos,actualBlockSize);beginPos += actualBlockSize;//本次的终点,下一次的起点}}/*** 文件分割  输入 输出* 文件拷贝* @param idx 第几块* @param beginPos 起始点* @param actualBlockSize 实际大小* @throws IOException */public void splitDetail(int idx,long beginPos,long actualBlockSize) throws IOException{//1、创建源File src = new File(this.filePath);//源文件//得到第几块的路径       List容器取出块路径File dest = new File(this.blockPath.get(idx));//目标文件//2、选择流RandomAccessFile raf = null;//输入流BufferedOutputStream bos = null;//输出流try {raf = new RandomAccessFile(src, "r");bos = new BufferedOutputStream(new FileOutputStream(dest));//3、读取文件raf.seek(beginPos);//4、缓冲区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;//每个block最后一部分读取完之后,一定要break,否则就会继续读取}}} catch (FileNotFoundException e) {e.printStackTrace();}finally{FileUtil.close(bos,raf);}}/*** 文件的合并   (方法一)*/public void merge1(String destPath){//创建源File dest = new File(destPath);//选择流BufferedOutputStream bos = null;//输出流BufferedInputStream bis = null;//输入流try {bos = new BufferedOutputStream(new FileOutputStream(dest,true));//表示追加for(int i=0; i<this.blockPath.size();i++){//读取bis = new BufferedInputStream(new FileInputStream(new File(this.blockPath.get(i))));//缓冲区byte[] flush = new byte[1024];//接收长度int len = 0;while(-1 !=(len = bis.read(flush))){//打印到控制台//System.out.println(new String(flush,0,len));bos.write(flush,0,len);                 }bos.flush();FileUtil.close(bis);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{FileUtil.close(bos);}   }/*** 文件的合并  (方法二)*/ public void merge(String destPath) throws IOException{//1、创建源File dest = new File(destPath);//2、选择流//SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,//并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,//直到到达包含的最后一个输入流的文件末尾为止。 SequenceInputStream sis = null;//输入流BufferedOutputStream bos = null;//输出源   //创建一个容器Vector<InputStream> vi = new Vector<InputStream>();for(int i=0; i<this.blockPath.size();i++){vi.add(new BufferedInputStream(new FileInputStream(new File(this.blockPath.get(i)))));     }//SequenceInputStream sis = new SequenceInputStream(vi.elements()); 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))){//打印到控制台//System.out.println(new String(flush,0,len));bos.write(flush,0,len);     }bos.flush();FileUtil.close(sis);}public static void main(String[] args) {//源文件路径、每块的大小(字节数)、目标快的路径SplitFile split = new SplitFile("g:/writer.txt",100,"g:/try");//文件初始化split.init();//文件分割try {//split.split("g:/try");split.split(split.destBlockPath);   } catch (IOException e) {e.printStackTrace();}//文件合并try {split.merge("g:/try/test.txt");} catch (IOException e) {e.printStackTrace();}//System.out.println(file.size);}
}

文件分割与合并(Java)相关推荐

  1. 超级文件分割《合并》机(分割大文件)

    需求:现在文件的大小越来越大,很多移动设备无法一次把文件一次全部拷贝完全,这种情况就需要把文件分割小点,分几次传送,然后,合并起来,这样就实现了大文件的拷贝功能 介绍:我的这个用的是吧文件分割成1M大 ...

  2. Linux文件分割与合并:splitcat(转载)

    转自:http://os.51cto.com/art/201104/255359.htm Linux下文件分割可以通过split命令来实现,而用cat进行文件合并.而分割可以指定按行数分割和安大小分割 ...

  3. 使用python实现大文件分割与合并

    在平常的生活中,我们会遇到下面这样的情况: 你下载了一个比较大型的游戏(假设有10G),现在想跟你的同学一起玩,你需要把这个游戏拷贝给他. 然后现在有一个问题是文件太大(我们不考虑你有移动硬盘什么的情 ...

  4. c#文件分割与合并 part 1 (转自互联网)

    这是一篇简单介绍了使用c#来进行文件的合并和分割,我在我的项目中,需要使用到这个模块的功能,所以自己实践之后,发于此,以作备份: 首先,我们先来做文件分割的部分,我们新建了个winform项目,项目设 ...

  5. c语言文件分割与合并程序详解,如何实现将一个文件分割成多个小文件

    你也许会遇到到这样一个问题?当你有一个较大的软件,而无法用一张软盘将其全部拷下时,你也许会想到该将它分解开,分盘拷回去后,再将它们合并起来.现在的这种分割工具很多,你想自己动手做一个适合自己的分割工具 ...

  6. Linux:split 文件分割和合并

    一.简介 Linux服务器普通的文件上传下载一般用 sz rz 就可以满足要求了,但是遇到大文件(超过4G)时就不好使了. 这是就可以通过将大文件分割为小文件传输,之后再进行文件合并即可. 二.用法 ...

  7. RandomAccessFile实现文件分割、合并

    RandomAccessFile可使用的操作模式: "rwd"模式可用于减少执行的"I/O"操作数量.使用"rwd"仅要求更新要写入存储的文 ...

  8. C#——文件分割与合并

    首先,做文件分割的部分,新建了个winform项目,项目设计如下: 这里有如下控件: 一个OpenFileDialog组件,用于选择要分割的大文件. 一个ProgressBar组件,用以显示文件分割的 ...

  9. 今天写了一个含配置文件的 文件分割 及 合并 的java程序。

    SplitFileDemo(分割)类 package Split;import java.io.File; import java.io.FileInputStream; import java.io ...

  10. java文件分割合并_java实现文件分割与合并 类示例源码

    [实例简介] [实例截图] [核心代码] package cn.part.com; import java.io.BufferedInputStream; import java.io.Buffere ...

最新文章

  1. 中国科学家研发新的全基因组组装算法
  2. centos7离线安装ansible
  3. python 利用 whoosh 搭建轻量级搜索
  4. SQL Server误区30日谈-Day27-使用BACKUP ... WITH CHECKSUM可以替代DBCC CheckDB
  5. python测试函数
  6. 1 TB /节点时快速,可预测且高度可用
  7. git灰度发布版本_Git发布2.30版本
  8. IndexOptions类说明
  9. 任意阶幻方解法及c++实现
  10. do something for your dream
  11. 椭圆曲线方程加解密算法研究(一)
  12. 自动控制原理3.3---二阶系统的时域分析
  13. 【华为OD机试真题 JS】统计射击比赛成绩
  14. 优秀蓝牙耳机推荐,热销不错的四款蓝牙耳机推荐
  15. 【金猿信创展】恒生电子——全栈式信创解决方案,助力金融信创行稳致远
  16. 易语言编写的WIfi热点共享工具 源码+成品
  17. xxl-job基本使用
  18. 黑盒测试技术(边界值分析法)——软件质量保证与测试
  19. 分享个网站,用Python批量采集4K壁纸【Python采集壁纸系列一】
  20. 爆笑:yuer的作文

热门文章

  1. w7文件加密提示没启用服务器,win7文件夹设置密码没有密钥提示
  2. 企业邮箱服务器如何设置?
  3. linux下如何模拟按键输入和模拟鼠标
  4. Dapper基础入门
  5. Research Mindmap
  6. java add方法怎么用_Java ArrayList add() 方法
  7. java覆盖的概念_java中覆盖是什么意思?java方法覆盖的概念详解
  8. SAP 中文小写金额转大写金额 amount in word(支持负数)
  9. RESTful接口开发规范以及注意事项
  10. MP3音频解码详细过程(二)