用java实现文件的拆分和合并
找到一个文件,按照100k为单位,拆分成多个子文件,并且以编号作为文件名结束。
比如文件 信息.xlsx,大小是389k。
拆分之后,成为
信息.xlsx-0——100k
信息.xlsx-1——100k
信息.xlsx-2——100k
信息.xlsx-3——89k
而后,对拆分的文件进行合并。
直接上图:
package IODemo.inputStreamOut;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import com.sun.tools.javac.code.Attribute.Array;
public class SplitorMergeFiles {
public static void main(String[] args) {
// 拆分
// File f = new File("D:\\test\\信息.xlsx");
// split(f);
//合并
File f = new File("D:\\test\\merge");
File[] fs = f.listFiles();
for (File file : fs) {
System.out.println(file);
}
File newFile = new File("D:\\test\\merge\\newfile");
merge(fs,newFile);
}
// 拆分文件
public static void split(File f) {
byte[] data = new byte[(int) f.length()];
try {
FileInputStream fis = new FileInputStream(f);
fis.read(data);// 读取文件到data中
fis.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(data.length / 1024 + "k");
int len = 1024 * 100;
int n = (int) (f.length() / len);// 拆分为多少100k的文件夹
int m = (int) (f.length() / len);// 余数再额外准备一个文件夹
File[] fs = new File[n + 1];// 设立文件数组,用来存放文件。长度为总共需要生成文件的个数。
for (int i = 0; i < n + 1; i++) {
int start = i * 102400;
int end = (i + 1) * 102400;
fs[i] = new File(f + "-" + i);
if (i < n) {
byte[] b = Arrays.copyOfRange(data, start, end);
try {
FileOutputStream fos = new FileOutputStream(fs[i]);
fos.write(b);
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
start = i * 102400;
end = (int) f.length();
byte[] b = Arrays.copyOfRange(data, start, end);
try {
FileOutputStream fos = new FileOutputStream(fs[i]);
fos.write(b);
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("输出子文件夹:" + fs[i].getAbsolutePath()
+ " 其长度为: " + fs[i].length());
}
}
// 合并文件
public static void merge(File[] fs,File newFile) {
int len = 0;
for (File file : fs) {
len += file.length();
}
byte[] b = new byte[len];//构造一个数组,存放合并的数据
int len1 = 0;//初始化复制到目的数组的起始值
for (File file : fs) {
byte[] bi = new byte[(int) file.length()];
try {
FileInputStream fis = new FileInputStream(file);
fis.read(bi);
fis.close();
System.out.println(bi.length);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.arraycopy(bi, 0, b, len1, (int) file.length());
len1 +=file.length();
try {
FileOutputStream fos = new FileOutputStream(newFile);
fos.write(b);
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
最后结果图附上。