文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并。很多高大上的分布式文件系统(比如: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
原神祈愿模拟器最新版
原神祈愿模拟器手机版是一款完整汉化的趣味原神抽卡模拟小游戏,
宝宝森林美食完整版
宝宝森林美食游戏最新版是一款十分有趣的休闲益智游戏,帮助宝宝
g沙盒仇恨官方英文版(gorebox)
G沙盒仇恨英文原版是一款最近非常火热的沙盒模拟类游戏,在这里
迷你世界测试服最新版2024
迷你世界测试服2021最新版,即迷你世界的先遣服版本,用户能
闪耀暖暖最新版2024
闪耀暖暖手游这是非常好玩的换装手游,游戏内容丰富有趣,游戏环