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

基本思路:

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

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

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

        使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小米MIUI关闭内容中心通知

被MIUI的内容中心打扰了许久&#xff0c;终于找到彻底关闭它的方式。 这个内容中心&#xff0c;在应用列表里找不到卸载&#xff0c;在通知管理里也找不到&#xff0c;小米把它藏得深。 关闭内容中心通知 第一步&#xff0c;先进入内容中心&#xff0c;然后切换到后台&#…

python编码器_自编码器和分类器python

展开全部 你好&#xff0c;下面是一个keras的softmax分类器自编码器的python代码。你需要安装e5a48de588b662616964757a686964616f31333431343665最新的theano1.0.4才可以跑。import os; os.environ[KERAS_BACKEND] theano import keras from keras.datasets import mnist fro…

Java虚拟机-第二篇-GC算法与内存分配策略

2019独角兽企业重金招聘Python工程师标准>>> GC引入 在Java的运行时数据区中&#xff0c;程序计数器、虚拟机栈、本地方法栈三个区域都是线程私有的&#xff0c;随线程而生&#xff0c;随线程而灭&#xff0c;在方法结束或线程结束时&#xff0c;内存自然就跟着回收…

python在函数内部有没有办法定义全局变量_主函数内部的全局变量python

你想要什么是不可能的*。你可以在全局命名空间中创建一个变量&#xff1a; myglobal "UGHWTF" def main(): global myglobal # prevents creation of a local variable called myglobal myglobal "yu0 fail it" anotherfunc() def anotherfunc(): print…

软件项目经理应该具备的心态

我们&#xff08;项目经理&#xff09;必须认识到有些现实是无法改变的&#xff1a; 1.市场前期都会过度承诺 2.公司是要赚钱的&#xff0c;仅仅有虚名但不赚钱的事情公司是不会真正持久的 3.任何公司都是资源不足的 4.任何公司都有或多或少的管理问题&#xff0c;没有问题…

Caffe学习记录(十一) ICNet分割网络学习

ICNet 是一个既考虑性能&#xff0c;又考虑准确率的分割网络&#xff0c;包含了语义分割和边缘精确分割&#xff0c;因为偶然看到就简单的了解一下&#xff0c;记录下来 论文是: ICNet for Real_time Semantic Segmentation on High Resolution Images&#xff0c;整篇文章都在…

如何利用python自动化办公项目_python办公自动化:自动进行word文档处理和排版

上节python办公自动化:自动打开word文档我们一起学会了在python里打开并保存一个word文档。这节我们将会学会如何利用python进行文本处理和将其在word里进行排版等技巧。python进行文本处理和将其在word里进行排版等技巧 使用文本 要有效地处理文本&#xff0c;首先要了解一些块…

不同项目组织结构间的区别

项目组织结构分 职能型 项目型 矩阵型 弱矩阵型 平衡矩阵 强矩阵 职能型 场景举例&#xff1a; 去饭店吃饭。 饭店A&#xff0c;门口宣传接待一组人&#xff0c;进店了&#xff0c;换另一组人安排就坐点餐&#xff0c;过一会儿&#xff0c;有专人上菜...... 这是职能型&#x…

PMO在组织结构中的作用

项目管理办公室是企业设立的一个职能机构名称&#xff0c;也有的称作项目管理部、项目办公室或项目管理中心等&#xff0c;英文为&#xff1a; Project Management Office &#xff0c;缩写简称&#xff1a;PMO。 PMO是在组织内部将实践、过程、运作形式化和标准化的部门&…

python支持多种编程范式吗_Python3学习之路~6.1 编程范式:面向过程 VS 面向对象...

编程范式 编程是程序员用特定的语法数据结构算法组成的代码来告诉计算机如何执行任务的过程&#xff0c;一个程序是程序员为了得到一个任务结果而编写的一组指令的集合&#xff0c;正所谓条条大路通罗马&#xff0c;实现一个任务的方式有很多种不同的方式&#xff0c;对这些不同…

Spring框架知识复习之二

Spring使用注解对Bean进行管理 1 使用注解需配置aop相关xsd文件的约束和命名空间 xsd文件名为&#xff1a;spring-aop-4.2.xsd 2 注解组件扫描配置 示例如下&#xff1a;base-package属性 设置扫描指定包下的所有子孙包 <context:component-scan base-package"cn.itma.…

比较合理的项目组织架构

&#xff08;从自己从业经验中总结所得&#xff09; PMO就像是操作系统&#xff0c;项目组1...N就像进程&#xff08;开启多个软件&#xff09;&#xff0c;项目任务就像线程&#xff0c;项目组成员就像CPU&#xff08;具体干活的&#xff09;&#xff0c;CPU资源是有限的&…

python培训一般要多久_入门 Python 要多久时间?该如何学习?

入门 Python 要多久?该如何学习? 学Python和学其他的语言其实是相同的&#xff0c;我给新同事讲课的时候就说学编程和练武功其实是很相似&#xff0c;入门大致这样几步: 找本靠谱的书, 找个靠谱的师傅&#xff0c; 找一个地方开始练习。 学语言也是的&#xff1a;选一本通俗易…

小计 合计 总计 共计 怎么解释?

排列顺序&#xff1a;小计、总计、合计。共计分开使用。 小计&#xff1a;小计就是简单核算一下单个体&#xff0c;可理解为日小计 合计&#xff1a;合计就是把所有小计加起来&#xff0c;可理解为月合计 总计&#xff1a;总计就是把合计加起来&#xff0c;可理解为年总计 …

巧用位运算存状态

2019独角兽企业重金招聘Python工程师标准>>> 某种场景需要,一个事物 有多种状态并列存在的时候,或者权限,我们可以使用 |,&,~ 来处理,具体代码如下: package com.example.demo;/*** 权限状态处理*/ public class StatusUtil {/*** 判断状态是否开启* param fl…

工时单位天与人天的区别?

售前工作时&#xff0c;向甲方提供报价单是必需的&#xff0c;报价要有依据。 当提供的报价单的工时单位是&#xff08;人/天&#xff09;的时候&#xff0c;需要向甲方额外解释下&#xff0c;人/天人数*天数。比如&#xff1a;编码开发&#xff0c;40人天&#xff0c;投入1位…

python怎么做项目_听说你没有python项目可做,我教你个方法

原标题&#xff1a;听说你没有python项目可做&#xff0c;我教你个方法 学习了一段时间的Python&#xff0c;最近出现了“饥荒”&#xff0c;感觉需要多看些代码&#xff0c;多学习学习别人做些什么&#xff0c;但却不知道做点什么来进行练习。 说到看代码&#xff0c;我就想到…

Linux系统CPU相关信息查询

Linux系统CPU相关信息查询 作者&#xff1a;尹正杰 版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。 一.lscpu常用参数介绍 1>.查看帮助信息 [rootnode105 ~]# lscpu -h-a, –all: 包含上线和下线的cpu的数量&#xff0c;此选项只能与选…

excel下拉让函数参数部分不变

原理 使用相对引用就会变&#xff0c;bai使用绝对引用du就不变 A1是相对引用&#xff0c;上下拉公式的时候会zhi变成A2,A3…… $A$1是行列绝对引用dao&#xff0c;上下拉公式的时候不会变化 $A1&#xff0c;是行绝对引用&#xff0c;上下拉公式的时候会变化&#xff0c;$A2&am…

select * 排除字段_编写 SQL 的排除联接

有两个表&#xff0c;就叫作源表和目标表吧。它们有一个相同的字段&#xff0c;通过该字段可以把源表和目标表关联在一起&#xff0c;我们希望从源表中检索到的记录里的关联字段的值没有存在目标表中。举个例子&#xff0c;源表 dept&#xff0c;目标表 emp&#xff0c;获取 de…