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;然后切换到后台&#…

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

2019独角兽企业重金招聘Python工程师标准>>> GC引入 在Java的运行时数据区中&#xff0c;程序计数器、虚拟机栈、本地方法栈三个区域都是线程私有的&#xff0c;随线程而生&#xff0c;随线程而灭&#xff0c;在方法结束或线程结束时&#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…

比较合理的项目组织架构

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

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

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

巧用位运算存状态

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

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…

JS中调用bignumber处理高精度小数运算

ignumber.js用于数字精度要求较高的计算。 bignumber.js源码地址&#xff1a;https://github.com/MikeMcl/bignumber.js 1.下载bignumber.js。 下载地址&#xff1a;https://github.com/MikeMcl/bignumber.js/releases 2.引入js。 3.示例 html: <div><label>数1&am…

centos8安装搜狗输入法_搜狗拼音输入法去广告版

搜狗输入法是搜狗公司2006年6月推出的一款汉字输入法工具。与传统输入法不同&#xff0c;搜狗输入法是第一款为互联网而生的输入法——它通过搜索引擎技术&#xff0c;将互联网变成了一个巨大的“活”词库。应该有许多人电脑上都装了吧&#xff0c;不过一般下载的版本天天弹广告…

Project查看资源分配情况

选择 资源图表&#xff0c;点击 格式&#xff0c;在图表里选择

webbrowser实现input tab事件_如何合理构造一个Uploader工具类(设计到实现)

作者&#xff1a;Chaser (本文来自作者投稿) 原文地址&#xff1a;https://juejin.im/post/5e5badce51882549652d55c2源码地址&#xff1a;https://github.com/impeiran/Blog/tree/master/uploader前言本文将带你基于ES6的面向对象&#xff0c;脱离框架使用原生JS&#xff…

小达人点读笔的任我贴贴纸怎么使用?

小达人点读笔是一款高性能、高容量点读笔。其自身的开放性、共享性、传播性让可读书籍及音频资源真正的达到了海量且优质有用。 下面我们来认识一下标配中任我贴上的贴纸&#xff1a; 智能贴 用于已经布有二维码的有声图书的封面&#xff0c;比如律动英语&#xff0c;成长一线&…

vscode必备插件_10个必备的Visual Studio Code (VS code)插件

我基本上每天都用vs code&#xff0c;我喜欢的小巧&#xff0c;开源&#xff0c;免费并且非常强大。尤其它非常多的插件可以免费使用。这里我把经常用插件介绍给大家&#xff0c;希望大家留言讨论我把VS code 插件分两类&#xff0c;一类是处理可视化的&#xff0c;比如说颜色&…

软考官方教材:信息系统项目管理师教程(第三版)

2020年下半年信息系统项目管理师考试官方教材将继续使用清华大学出版社出版的信息系统项目管理师教程第3版&#xff08;特别注意&#xff0c;有某些辅导资料也打着信息系统项目管理师教程第3版的旗号&#xff0c;各位考生一定要看准官方指定教材是由全国计算机专业技术资格考试…

centos挂载windows共享目录

2019独角兽企业重金招聘Python工程师标准>>> 在windows中创建一个共享文件夹记住这个网络路径&#xff0c; 在centos上新建文件夹/mnt/MyShare $> mkdir /mnt/MyShare挂载 username用户名.password登录密码 $> Sudo mount -t cifs -o username用户名,pass…