0 切割思路和合并思路:
代码: 注意体会代码的注释, 感觉 合并方法 merge1 要比 merge 简单些,没必要在把分割后的文件在组合成一个流文件然后在写出去,多了一个步骤,没必要,不过主要是展示SequenceInputStream的使用.
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 com.bjsxt.io.util.FileUtil; 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 src =null; //健壮性 判断要分割文件是否存在 if(null==filePath ||!(((src=new File(filePath)).exists()))){ return; } if(src.isDirectory()){ return ; } //文件名 this.fileName =src.getName(); //计算块数 实际大小 与每块大小 this.length = src.length(); //修正 每块大小 if(this.blockSize>length){ // 如果 blockSize > 文件实际大小,则修正 blockSize为真实大小 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); } } /** * 文件的分割 * 0)、第几块 * 1、起始位置 * 2、实际大小 * @param destPath 分割文件存放目录 */ public void split(){ long beginPos =0; //起始点 long actualBlockSize =blockSize; //实际大小 //计算所有块的大小、位置、索引 for(int i=0;i<size;i++){ if(i==size-1){ //最后一块时,重新设置标定 actualBlockSize 块大小 actualBlockSize =this.length-beginPos; } spiltDetail(i,beginPos,actualBlockSize); // 每次循环,都要传递 第几块,当前这块的起始位置,和要写出的块大小 beginPos+=actualBlockSize; //本次的终点,下一次的起点 } } /** * 文件的分割 输入 输出 * 文件拷贝 * @param idx 第几块 * @param beginPos 起始点 * @param actualBlockSize 实际大小 */ private void spiltDetail(int idx,long beginPos,long actualBlockSize){ //1、创建源 File src = new File(this.filePath); //源文件 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)); //读取文件 raf.seek(beginPos); // 这个类的方法只负责去目标文件中从起始位置开始读取数据,在文件切割并写出方法中,具体从目标文件读多少是上面参数传递进来的 //缓冲区 byte[] flush = new byte[1024]; //接收长度 int len =0; while(-1!=(len=raf.read(flush))){ // 不能直接这么写出,文件块的长度比如是flush的2.5倍,因为源头读取文件为filePath,我们的目的是要将文件中的其中一个块actualBlockSize写出去 //如果while中这么写while(-1!=(len=raf.read(flush))){bos.write(flush, 0, len);} 那么就会一直循环把这个文件都写去去了,和我们的目的相违背 // bos.write(flush, 0, len); 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); } } /** * 文件的合并 SequenceInputStream 合并分割好的流 */ public void merge(String destPath){ //创建源 File dest =new File(destPath); //选择流 BufferedOutputStream bos=null; //输出流 SequenceInputStream sis =null ;//输入流 //创建一个容器 Vector<InputStream> vi = new Vector<InputStream>(); //Vector.elements() ====》 Enumeration<E> elements() 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()); // 使用这个流来组织需要合并的各个输入流成一个流 然后这个合并好的流在整个输出 SequenceInputStream(Enumeration<? extends InputStream> e) //缓冲区 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 void merge1(String destPath){ //创建源 File dest =new File(destPath); //选择流 BufferedOutputStream bos=null; //输出流 try { bos =new BufferedOutputStream(new FileOutputStream(dest,true)); //追加 BufferedInputStream bis = null; 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))){ bos.write(flush, 0, len); } bos.flush(); FileUtil.close(bis); } } catch (Exception e) { }finally{ FileUtil.close(bos); } } /** * @param args */ public static void main(String[] args) { SplitFile split = new SplitFile("E:/xp/20170502/test/测试.xls","E:/xp/20130502",51); //System.out.println(split.size); //split.split(); 文件分割并输出 split.merge("E:/xp/20170502/test1.xls"); //合并后输出到 test1.xls } }
相关推荐
本篇文章将深入探讨如何使用Java的IO流进行文件切割和合并。 首先,我们要了解Java中的IO流。Java的IO库提供了大量的类来处理输入和输出,如FileInputStream和FileOutputStream用于读写文件,BufferedInputStream和...
在这个“文件切割合并器”的项目中,我们主要关注的是Java的IO流和图形用户界面(GUI)的应用。 IO流是Java中处理输入输出的核心机制,包括字节流和字符流两大类,分别处理二进制数据和文本数据。在这个项目中,...
本篇文章将详细探讨Java语言中如何实现文件切割和合并,并提供相关的实践示例。 一、文件切割 1. **为什么要切割文件**: 当文件过大,如超过单个邮件附件大小限制,或者为了提高网络传输速度,避免一次性加载大...
在JAVA编程语言中,文件切割和合并是常见的文件操作任务,尤其在大数据处理、网络传输或者存储优化等场景中有着广泛的应用。哈工大软件学院的JAVA实验旨在让学生掌握这些核心技术,通过实践来提升编程技能。在这个...
【文件切割合并程序】是一种利用C#编程语言开发的实用工具,主要功能是对大文件进行高效、稳定的分割和合并操作。在处理大量数据或者需要在不同的存储设备间传输大型文件时,这种工具显得尤为重要。C#语言凭借其强大...
理解文件系统API和流的概念至关重要。同时,为了保证程序的健壮性,需要考虑异常处理和资源管理,确保在操作过程中能正确处理错误并避免内存泄漏。在实际应用中,这些工具可能还需要提供图形化界面或命令行接口,让...
2. **IO流**:在Java中,文件切割的核心在于使用输入/输出流(IO流)。`java.io`包提供了对文件读写的基本支持,如FileInputStream和FileOutputStream,它们分别用于读取和写入文件。 3. **BufferedInputStream和...
在这个文件切割工具中,C#的类库如System.IO可能被用来处理文件的读写操作,确保数据完整性和效率。开发者可能利用Stream类来读取大文件,并通过缓冲区策略分割文件到指定大小,然后创建多个小文件。 "说明.txt" ...
对于初学者来说,研究这个示例可以帮助理解Java中的文件操作和流处理,对于进阶开发者,这个实现可能提供了一个优化或改进的基础,例如加入错误处理、进度显示、多线程处理等功能。总之,Java文件切割与恢复是一个...
在文件分割和合并的过程中,FileStream扮演着核心角色,它负责读取文件内容并按照指定的大小或数量分割成若干部分,或者将这些部分按顺序合并回原始文件。 在文件分割过程中,开发者可能选择了两种不同的策略:按...
在Java中,`java.io.FileInputStream` 和 `java.io.FileOutputStream` 类用于读写文件,而 `java.io.RandomAccessFile` 类则支持随机访问文件,这对于文件切割尤其有用,因为它可以让我们在文件的任意位置进行读写...
本文将详细介绍一个用C#编写的TXT文件切割器,并探讨相关技术点,以及如何利用该工具处理《笑傲江湖》这样的长篇小说。 首先,"C#写的txt文件切割器"是指使用C#编程语言开发的一款软件工具,它的主要功能是将大的...
理解以上知识点后,你将能够阅读和学习这个“Java文件切割器源代码”中的实现细节,甚至可以根据自己的需求进行修改或扩展。通过研究和实践,你不仅能掌握文件操作的基本技巧,还能对Java并发处理、流操作有更深入的...
这两个类是Java标准库中的IO流类,它们能够高效地读取和写入文件。 首先,我们从`FileReader`开始。`FileReader`是Java中的字符输入流,用于读取字符数据。它直接继承自`InputStreamReader`,默认使用平台的默认...
在Java中,我们可以使用`java.io`包中的`File`类、`BufferedInputStream`和`BufferedOutputStream`进行文件操作。`SplitImageUtil`类很可能包含了两个核心方法:一个用于分割大文件,另一个用于合并已分割的文件。 ...
虽然`FileUtils`没有直接提供文件分割和合并的功能,但它可以方便地与其他工具结合,如在分割和合并过程中创建、删除文件。 例如,使用`FileUtils.copyFile()`可以简化文件的移动或复制操作,`FileUtils....
Java文件切割器是一种实用工具,它允许用户将...通过分析和学习这个Java文件切割器的源代码,我们可以深入了解Java的文件处理、流操作、异常处理以及可能的并发和设计模式应用,这对任何Java开发者来说都是宝贵的经验。
综上所述,Java文件切割器涉及到的编程技术包括文件I/O流的使用、文件操作异常处理、可能的多线程处理以及文件合并等。通过理解和实践这样的项目,可以提升对Java文件操作的掌握,同时也能为实际工作中的类似问题...
对于图片文件,可能按照图像的宽度和高度进行切割。 接着,我们讨论文件合并的过程。在合并文件时,我们通常需要按照一定的顺序读取所有拆分后的文件,然后将它们的内容追加到一个新的文件中。这里,我们可能需要...