1.拆分文件
找到一个大于100k的文件,按照100k为单位,拆分成多个子文件,并且以编号作为文件名结束。
比如文件 eclipse.exe,大小是309k。
拆分之后,成为
eclipse.exe-0
eclipse.exe-1
eclipse.exe-2
eclipse.exe-3
思路:
先把源文件的所有文件读取到内存中,然后从内存中挨个存到子文件里
package j2se;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import javax.management.RuntimeErrorException;
public class IOChaifengWenJian {
/**
找到一个大于100k的文件,按照100k为单位,拆分成多个子文件,并且以编号作为文件名结束。
比如文件 eclipse.exe,大小是309k。
拆分之后,成为
eclipse.exe-0
eclipse.exe-1
eclipse.exe-2
eclipse.exe-3
*/
public static void main(String[] args) {
//拆分文件
int eachSize = 100;//100k
File file = new File("d:/LOL/LOL.txt");
splitFile(file, eachSize);
}
//思路:先把源文件的所有文件读取到内存中,然后从内存中挨个存到子文件里
private static void splitFile (File file, int eachSize) {
//file拆分的文件,eachSize是每一块的大小
if (file.length() == 0) {
throw new RuntimeErrorException(null, "文件长度为0,不可以拆分!");
}
byte[] data = new byte[(int) file.length()];//新建字节数组
try {
FileInputStream fis = new FileInputStream(file);
fis.read(data);
fis.close();
} catch(IOException e) {
e.printStackTrace();
}
int fileNumber;//计算被划分成多少份子文件
if (file.length() % eachSize == 0) {
fileNumber = (int)(data.length / eachSize);
} else {
fileNumber = (int)(data.length / eachSize) + 1;
}
for (int i = 0; i < fileNumber; i++) {
String eachFileName = file.getName() + "-" + i;
File eachFile = new File(file.getParent(), eachFileName);
byte[] eachContent = null;
if (i != (fileNumber - 1)) {
//如果不是最后一个,每个长度相同
eachContent = Arrays.copyOfRange(data, eachSize * i, eachSize * (i + 1));
} else {
//最后一个(长度不一致)
eachContent = Arrays.copyOfRange(data, eachSize * i, data.length);
}
//将字节数组写入文件
try {
FileOutputStream fos = new FileOutputStream(eachFile);
fos.write(eachContent);
fos.close();
System.out.println("输出子文件" + eachFile.getAbsolutePath() + "其大小是:" + eachFile.length());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.合并文件
把上述拆分出来的文件,合并成一个原文件。
以是否能正常运行,验证合并是否正确。
思路:
从eclipse.exe-0 开始,读取到一个文件,就写出到eclipse中,直到没有文件可以读取
package j2se;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOHeBingShuZu {
/*
* 把上述拆分出来的文件,合并成一个原文件
*/
public static void main(String[] args) {
//合并文件
mergeFile("d:/LOL", "LOL.txt");
}
//合并思路
//从eclipse.exe-0 开始,读取到一个文件,就写出到eclipse中,直到没有文件可以读取
private static void mergeFile (String folder, String fileName) {
try {
File f = new File(folder, fileName);
FileOutputStream fos = new FileOutputStream(f);
int index = 0;
while(true) {
File eachFile = new File(folder, fileName + "-" + (index++));
if (!eachFile.exists()) {
break;//如果子文件不存在就退出
}
//读取子文件内容
FileInputStream fis = new FileInputStream(eachFile);
byte[] eachContent = new byte[(int) eachFile.length()];
fis.read(eachContent);
fis.close();
fos.write(eachContent);
fos.flush();//手动刷新一次缓冲区
System.out.println("把子文件" + eachFile + "写到目标文件");
}
fos.close();//每次都要关闭
System.out.println("最后目标文件的大小:" + f.length() + "字节");
}catch (IOException e) {
e.printStackTrace();
}
}
}