java IO流将一个文件拆分为多个子文件代码示例
作者:人圭先生 发布时间:2023-08-30 12:46:15
标签:java,文件拆分,io流
文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并。很多高大上的分布式文件系统(比如:google的GFS、taobao的TFS)里,也是按block为单位,对文件进行分割或合并。
看下基本思路:
如果有一个大文件,指定分割大小后(比如:按1M切割)
step 1:
先根据原始文件大小、分割大小,算出最终分割的小文件数N
step 2:
在磁盘上创建这N个小文件
step 3:
开多个线程(线程数=分割文件数),每个线程里,利用RandomAccessFile的seek功能,将读取指针定位到原文件里每一段的段首位置,然后向后读取指定大小(即:分割块大小),最终写入对应的分割文件,因为多线程并行处理,各写各的小文件,速度相对还是比较快的。
下面代码是将一个文件拆分为多个子文件,每个大小是100K
package testIO;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Arrays;
public class subStream {
public static void main(String[] args) {
//先将源文件读取到内存中
int eachSize=100*1024;
File srcFile =new File("F:/test/test.txt");
//创建一个文件对象
splitFile(srcFile,eachSize);
}
public static void splitFile(File srcFile,int eachSize){
//判断文件是否符合拆分要求
if(srcFile.length()==0){
throw new RuntimeException("文件不符合拆分要求");
}
byte[] fileContent= new byte[(int) srcFile.length()];
try {
//将文件内容读取到内存中
FileInputStream fis=new FileInputStream(srcFile);
fis.read(fileContent);
fis.close();
}
catch (Exception e) {
e.printStackTrace();
}
//计算要次要拆分为多少份
int fileNumber;
if(fileContent.length%eachSize==0){
fileNumber = fileContent.length/eachSize;
} else{
fileNumber = fileContent.length/eachSize+1;
}
for (int i=0;i<fileNumber;i++){
String fileName = srcFile.getName()+"-"+i+".txt";
File fi = new File(srcFile.getParent(), fileName);
//在当前文件路径下创建拆分的文件
byte[] eachContent;
//将源文件内容复制到拆分的文件中
if(i!=fileNumber-1){
eachContent = Arrays.copyOfRange(fileContent, eachSize*i, eachSize*(i+1));
} else{
eachContent = Arrays.copyOfRange(fileContent, eachSize*i, fileContent.length);
}
try {
FileOutputStream fos = new FileOutputStream(fi);
fos.write(eachContent);
fos.close();
System.out.printf("输出子文件 %s,其大小是 %d,每个的大小是%d\n",fi.getAbsoluteFile(),fi.length(),eachContent.length);
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
来源:http://blog.csdn.net/sinat_15274667/article/details/53982986
0
投稿
猜你喜欢
- 由于考虑到数据库的安全性,不被轻易SQL注入,执行查询语句时,一般不使用直接拼接的语句,而是使用参数传递的方法。然后在使用参数传递的方法中时
- 前言最近公司在重构广告系统,其中核心的打包功由广告系统调用,即对apk打包的调用和打包完成之后的回调,需要提供相应的接口给广告系统。因此,为
- 前言:由于项目需求,短信验证码的接口需要换成阿里大于的,但是尴尬的发现阿里大于的jar包没有maven版本的,于是便开始了一上午的 * 引包之
- 本文实例讲述了Spring实战之Bean定义中的SpEL表达式语言支持操作。分享给大家供大家参考,具体如下:一 配置<?xml ver
- 线索二叉树的意义对于一个有n个节点的二叉树,每个节点有指向左右孩子的指针域。其中会出现n+ 1个空指针域,这些空间不储存任何事物,浪费着内存
- 责任链模式责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递
- Google的在Google I/O大会上推出了一款新的开发工具android studio。这是一款基于intellij IDE的开发工具
- socket 编程时的发送与接收数据时的问题在编写一个测试方法时,需要用启动一个程序监听一个端口,测试发送的数据是事正常,但是总是出现两个问
- 一、算法原理插入排序法:所谓插入排序法乃是将一个数目插入该占据的位置。假设我们输入的是 “53,27,36,15,69, 42”
- 实现InsertOrUpdate功能需求最近在项目开发中遇到这样一个需求:每天需要对相同的数据(也有可能是不同的)进行两次入库操作,数据不存
- 概述本文的编写初衷,是想了解一下Spring Boot2中,具体是怎么序列化和反序列化JSR 310日期时间体系的,Spring MVC应用
- 简介在实现登录功能时,一般为了安全都会设置验证码登录,为了防止某个用户用特定的程序暴力破解方式进行不断的尝试登录。常见验证码分为图片验证码和
- 详解 Java Maximum redirects (100) exceeded这些是可以用于定制默认HttpClient实现行为的参数:&
- 微信公众号开发一般是针对企业和组织的,个人一般只能申请订阅号,并且调用的接口有限,下面我们就来简单的描述下接入公众号的步骤:1、首先你需要一
- 1.系统架构包括哪些形式?C/S架构B/S架构2.什么是C/S架构?说白了就是客户端/服务端,我们需要安装特定的客户端软卷,例如:QQ。C/
- 问题描述:解决:检查以上是否版本一致。不行就再检查下面的:如果上面的方法还是不行的话,就建议你改一下pom文件中的maven插件编译级别,可
- Android 自定义imageview实现图片缩放实例详解 觉得这个自定义的imageview很好用 性能不错 所以
- 一、定义责任链模式(Chain of Responsibility Pattern):避免将一个请求的发送者与接受者耦合在一起,让多个对象都
- Spring cloud网关gateway进行websocket路由转发规则配置一、websocket及http路由转发规则配置后端是普通的
- 目录第一点——加载网页结构第二点——解析网页结构,转变为符合需求的数据实体第三点——保存数据实体,转变为符合需求的数据实体第四点——main