分割
思想:
读数据的流不结束,知道读完整个文档,写数据的流写完一个分割文件就关闭,下一个分割文件再打开一个新的。
代码如下:
/**
* 分割后的每个文件大小 这里是 1M
*/
private static final int SIZE = 1024*1024;
/**
* 文件分割
* @param srcFile 原始文件
* @param path 保存分割后的文件位置
*/
public void splitFile(File srcFile,String path){
if(srcFile.length() < 0 || !srcFile.isFile()){
log.error("文件内容不正确");
return;
}
FileInputStream inputStream =null;
try {
inputStream = new FileInputStream(srcFile);
// 分割后的文件的数量
long chunkFileNum = srcFile.length()%SIZE==0?srcFile.length()/SIZE:srcFile.length()/SIZE+1;
// 每次读取的大小
byte[] buffer = new byte[1024];
// 实际读取的大小
int length = -1;
for (int i =0; i<chunkFileNum; i++){
File distFile = new File(path+i);
FileOutputStream outputStream = new FileOutputStream(distFile);
while ((length =inputStream.read(buffer))!=-1){
outputStream.write(buffer);
if(distFile.length() >= SIZE){
//关闭写流,进行下一个分块文件
outputStream.close();
break;
}
}
}
log.info("分割完成请到{}文件下查看",path);
} catch (Exception e) {
log.error("解析文件错误",e);
e.printStackTrace();
}finally {
try {
//关闭读流
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
合并
与分割正好相反
思想:
写数据的流不结束,知道写完整个文档,读数据的流读完一个分割文件就关闭,下一个分割文件再打开一个新的。
代码如下
/**
* 文件合并
* @param path 需要服分割文件的路劲
* @param distFileName 合并后文件的名称,请加上后缀名
*/
public void mergeFile(String path,String distFileName){
File file = new File(path);
File[] listFiles = file.listFiles();
if(listFiles == null || listFiles.length ==0){
log.error("文件目录下为空");
return;
}
OutputStream out = null;
try {
out = new FileOutputStream(new File(distFileName));
for (int i=0;i<listFiles.length;i++){
// 每次读取的大小
byte[] buffer = new byte[1024];
// 实际读取的大小
int length = -1;
InputStream in = new FileInputStream(new File(path+"\\"+i));
while ((length = in.read(buffer))!=-1){
out.write(buffer,0,length);
}
in.close();
}
log.info("文件和并完成,请到{}查看",distFileName);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试
在上面的分割与合并的方法中我并没有判断路劲中是否包含 \\
,大家可以自行处理一下!
public static void main(String[] args) {
MyFileUtils utils = new MyFileUtils();
// utils.splitFile(new File("C:\\Users\\xiaomi\\Desktop\\GitTemp\\temp.ppt"),
// "C:\\Users\\xiaomi\\Desktop\\GitTemp\\");
utils.mergeFile("C:\\Users\\xiaomi\\Desktop\\GitTemp",
"C:\\Users\\xiaomi\\Desktop\\GitTemp\\temp2.ppt");
}