基本思路:

文件分割:将一个文件分割成若干个独立的文件。

       设置分割后小文件文件的字节数,然后读取被分割文件,

     将对应的字节数写入分割后的小文件中。

        使用seek定位下一次读取位置。

     

文件合并:将分割后的若干的文件合并成一个完整的文件。

     按照原有分割顺序逐个读取分割后的小文件,

     然后以追加的方式写入合并的文件中。

读取被分割文件将指定字节数写入分割后小文件时,下一次读取时要确保当前读取位置是上一次的写入的终点。

例如文件有5000K,设置分割后的文件大小1000K,那么第一次从0开始读取1000K写入小文件1,第二次就要从1000开始读取1000K写入小文件2.

这时就需要用到seek()不断设置文件读取位置。

seek是RandomAccessFile类中的函数

构造方法,mode为设置读写方法,“”r“为只读”w”为只写。

设置文件指针偏移量,下一次读或写时,从当前设置的位置开始。

read,write方法与输入输出流函数相同。

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.OutputStream;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;public class FileSplit {private String filePath;//文件路径private long blockSize;//每一块大小private int blockNum;//块个个数private List<String> blockName;//每一块名称private String [] name;public FileSplit(){this.blockName = new ArrayList<String>();}public FileSplit(String filePath){this(filePath,1024);//未知的尺寸则默认1024
    }public FileSplit(String filePath, long blockSize){this();this.filePath = filePath;this.blockSize = blockSize;init();}public String getFilePath() {return filePath;}public void setFilePath(String filePath) {this.filePath = filePath;}public long getBlockSize() {return blockSize;}public void setBlockSize(long blockSize) {this.blockSize = blockSize;}public int getBlockNum() {return blockNum;}public void setBlockNum(int blockNum) {this.blockNum = blockNum;}public List<String> getBlockName() {return blockName;}public void setBlockName(List<String> blockName) {this.blockName = blockName;}private void initBlockName(String destPath){name = new File(filePath).getName().split("\\.");for(int i = 0; i < blockNum; i++){blockName.add(i,destPath + "\\" + name[0] + "_" + i + "." +name[1]);}}public void init(){File src = new File(filePath);//路径名不存在,或该路径表示的文件不存,或是文件夹在则结束。if(filePath == null || !src.exists()||src.isDirectory()){return;}if(blockSize >= src.length())this.blockSize = src.length();this.blockNum = (int)Math.ceil(src.length()*1.0/blockSize);}//destPath分割文件存放目录public void split(String destPath){//分割函数initBlockName(destPath);//初始化分割后的文件名long start = 0;for(int i = 0; i < blockNum; i++){if(i == blockNum - 1)//计算最后一块大小blockSize = new File(filePath).length()%blockSize;split_m(i,start,blockSize);//参数含义:第i块,读取位置,读取内容大小start += blockSize;//更新起始位置//    System.out.println(start);
        }}//开始分割,每次分割一块private void split_m(int blockNum,long start,long blockSize){int len = 0;byte[] flush = new byte[1024];RandomAccessFile raf = null;//源文件BufferedOutputStream bos = null;//分割后文件try {bos = new BufferedOutputStream(new FileOutputStream(new File(blockName.get(blockNum))));raf = new RandomAccessFile(new File(filePath),"r");try {raf.seek(start);//确定读取位置while(-1 != (len = raf.read(flush))){//当前块分割完成或文件已读取完跳出循环。//System.out.printf("%d %d %d %s\n",start,blockSize,len,blockName.get(blockNum));if((blockSize - len) >=0){//当前块大小-写入字节数,判断剩余字节bos.write(flush,0,len);//如果块剩余大小大于读取字节数,则写入读取字节数blockSize -= len;}else{//如果小于,则写入当前块剩余字节数bos.write(flush, 0, (int)blockSize);break;//分块文件已写满,跳出当前循环
                    }}bos.flush();bos.close();raf.close();} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}} catch (FileNotFoundException e) {// TODO Auto-generated catch block
            e.printStackTrace();}}public void Merge(String mergePath){//合并文件夹路径int len;byte[] flush = new byte[1024];InputStream is = null;OutputStream bos = null;for(int i = 0; i < blockNum; i++){try {//每次将一个分割后的文件写入合并文件中。//写入方法为追加bos = new BufferedOutputStream(new FileOutputStream(new File(mergePath,"merge." + name[1]),true));is = new BufferedInputStream(new FileInputStream(new File(blockName.get(i))));while(-1 != (len = is.read(flush))){//直到被分割的单个小文件读取完is.read(flush);//将读取内容放入flushbos.write(flush,0,len);//将读取内容写入文件。
                }bos.flush();bos.close();is.close();//释放当前资源,下次读取下一个小文件。} catch (FileNotFoundException e) {// TODO Auto-generated catch block
                e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}}
}

public class Main {public static void main(String[] args){FileSplit f = new FileSplit("F:\\依风\\Desktop\\temp.txt",500);//被分割文件,分割后的字节数f.split("F:\\依风\\Desktop");//分割后小文件的存放位置f.Merge("F:\\依风\\Desktop");//合并后大文件的存放位置}
}

转载于:https://www.cnblogs.com/huang-changfan/p/9908096.html

6.6(java学习笔记)文件分割(IO综合例子)相关推荐

  1. java学习笔记30(IO :缓冲流)

    缓冲流: 读取数据大量的文件时,读取的速度慢,java提供了一套缓冲流,提高IO流的效率: 缓冲流分为字节缓冲流和字符缓冲流: 字节输入缓冲流和字节输出缓冲流如下: package com.zs.De ...

  2. Java学习笔记29(IO字符流,转换流)

    字符流:只能操作文本文件,与字节流的区别是,字节流是按照字节来读取文件,而字符流是按照字符来读取,因此字符流的局限性为文本文件 字符输出流:Write类,使用时通过子类   每一次写入都要刷新 pac ...

  3. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

  4. Java学习笔记(7)——Java基础之IO多线程网络思维导图

    Java面向对象学习笔记之:包括IO(字节流,字符流,节点流,处理流).线程(线程创建,线程控制,线程同步).网络(TCP Scoket,  UDP Scoket)(全屏观看Java学习笔记(7)-- ...

  5. java学习笔记5--类的方法

    接着前面的学习: java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址 ...

  6. java学习笔记十三

    11. 凡是继承了FilterOutputStream或FilterInputStream的类都是过滤流,也就是说他们不能直接跟目标(键盘,文件,网络等,节点流可以)数据打交道,只能包装 Intput ...

  7. Java学习笔记5-1——多线程

    目录 前言 核心概念 线程创建 继承Thread类 实现Runnable接口 上述两个方法小结 实现Callable接口 并发问题简介 静态代理模式 线程状态 线程停止(stop) 线程休眠(slee ...

  8. 郑志远的java学习笔记

    郑志远的java学习笔记 郑志远    CCB 1         Java起源 略 2         Java语言概述 1.面向对象编程的3个原则:封装(encapsulation).继承(inh ...

  9. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

最新文章

  1. 移动硬盘插入提示格式化
  2. 人工智能数学基础知识
  3. 阿里云MVP陈磊:数字化转型驱动业务创新
  4. Mybatis注解的方式,如何实现MySQL ,update后,返回更新后的值
  5. 编译wide-dhcpv6-20080615报错问题
  6. 【Spring第七篇】Java配置类:JavaConfig
  7. 浅谈我对 jQuery 的了解
  8. 21天实战人工智能系列:人工智能产品经理最佳实践(3)
  9. Python语言编写有趣练习题!
  10. html 随机 小游戏代码,html小游戏代码#(精选.)(3页)-原创力文档
  11. 如何让Ubuntu联网
  12. c语言卡诺图算法实现,多变量卡诺图化简的算法实现.pdf
  13. 关于python画太阳花
  14. 网站被黑总被跳转到其他网站的处理解决过程
  15. ffmpeg php 抠像_FFMPEG批量绿幕抠像BAT脚本实现
  16. 智能座舱人机交互发展趋势
  17. matlab图像处理学习笔记
  18. python-介绍泊松分布(poisson分布)
  19. 31道Java面试题,java冒泡排序详解
  20. 最大流为什么会等于最小割

热门文章

  1. C语言 while 循环 - C语言零基础入门教程
  2. oracle去掉默认值sql,如何在T-SQL中删除默认值或类似约束?
  3. anaconda和python区别_初学 Python 者自学 Anaconda 的正确姿势是什么?
  4. decorator php,php设计模式 Decorator(装饰模式)
  5. mysql数据库开发环境_MacOS下搭载开发环境之数据库篇(Mysql + Navicat)
  6. ubuntu19 安装git_在Ubuntu 18.04上安装Git
  7. 俄亥俄州立大学计算机科学转学成功,俄亥俄州立大学转学成功率83.38%!!
  8. Linux下仿windows任务管理器,开源任务管理器 Process Hacker (Windows)
  9. mysql 存储过程插入慢_mysql存储过程太慢怎么办
  10. 如何设置Pycharm在打开Terminal终端时,自动进入虚拟环境?