思路:
把源文件的所有内容读取到内存中,然后再从内存中挨个分到子文件里
拆分对象:
代码如下
package TsstIO;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class SplitTheFile {
public static void main(String[] args) {
int eachSize = 2;//拆分的子文件长度2bit
File srcFile = new File("d:/threeBody.txt");//拆分源文件
splitTheFile(srcFile,eachSize);
}
private static void splitTheFile(File srcFile,int eachSize) {
if (0 == srcFile.length())
throw new RuntimeException("文件长度为0,不可拆分");
//创建数组读取数据
byte[] fileContent = new byte[(int) srcFile.length()];
//读取文件中的数据
try (FileInputStream fis = new FileInputStream(srcFile)) {
fis.read(fileContent);
} catch (IOException e) {
e.printStackTrace();
}
//开始计算子文件数目
int fileNumber;
if (0 == (fileContent.length % eachSize)) {
fileNumber = fileContent.length / eachSize;
} else {
fileNumber = fileContent.length / eachSize + 1;
}
for (int i = 0; i < fileNumber; i++) {
String eachFileName = srcFile.getName() + "-" + i;
File eachFile = new File(srcFile.getParent(), eachFileName);
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(eachFile);
fos.write(eachContent);
// 记得关闭
fos.close();
System.out.printf("输出子文件%s,其大小是 %d字节%n", eachFile.getAbsoluteFile(), eachFile.length());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}