java IO流将一个文件拆分为多个子文件代码示例
作者:人圭先生 时间:2023-08-30 12:46:15
文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并。很多高大上的分布式文件系统(比如: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
标签:java,文件拆分,io流
0
投稿
猜你喜欢
Android app应用多语言切换功能实现
2023-12-27 22:06:27
java guava主要功能介绍及使用心得总结
2023-07-30 11:01:54
C# FTP操作类分享
2022-05-11 22:03:49
c# 几个常见的TAP异步操作
2021-11-09 21:33:36
详细解读C++编程中的匿名类类型和位域
2023-11-02 23:08:18
DevExpress实现自定义TreeListNode的Tooltip的方法
2022-08-19 05:39:47
Java使用新浪微博API通过账号密码方式登陆微博的实例
2023-09-23 05:35:38
C#实现UI控件输出日志的方法详解
2021-10-07 02:45:41
ListView用法中与滚动相关的需求实现
2021-06-08 09:00:08
android初学者必须掌握的Activity状态的四大知识点(必读)
2022-08-31 13:26:31
详解怎么用Java的super关键字
2021-10-06 08:11:14
java mybatis如何操作postgresql array数组类型
2023-04-25 22:59:37
SpringBoot自定义注解实现Token校验的方法
2023-11-13 23:17:52
C#中Foreach循环遍历的本质与枚举器详解
2022-08-04 05:31:12
为什么Java开发需要配置环境变量
2023-08-13 13:11:03
Android源码中final关键字的用法及final,finally,finalize的区别
2023-10-11 09:03:43
Android 自定义圆形带刻度渐变色的进度条样式实例代码
2023-11-23 13:21:38
maven多个plugin相同phase的执行顺序
2021-07-07 10:33:34
java获取文件的inode标识符的方法
2021-06-19 15:10:49
浅谈java中String的两种赋值方式的区别
2021-09-21 23:59:36