代码
package com.liangrui.javebase.base002;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
public class SplitAndMergeFile {
public List<String> split(File splitFile,String splitSmallFilesDir,long splitSmallFileSize) {
long splitFileSize=splitFile.length();
long splitSmallFileBeginPos=0;
long splitSmallFileActualSize=splitSmallFileSize>splitFileSize?splitFileSize:splitSmallFileSize;
int size=(int)Math.ceil(splitFileSize*1.0/splitSmallFileSize);
List<String> splitSmallFileList=new ArrayList<String>();
for (int i = 0; i < size; i++) {
splitSmallFileList.add(splitSmallFilesDir+"/"+i+"_"+splitFile.getName());
}
for (int i = 0; i < size; i++) {
splitSmallFileBeginPos=i*splitSmallFileSize;
if (i==size-1) {
splitSmallFileActualSize=splitFileSize;
}else {
splitSmallFileActualSize=splitSmallFileSize;
splitFileSize-=splitSmallFileActualSize;
}
try {
RandomAccessFile splitRandomAccessFile=new RandomAccessFile(splitFile, "r");
RandomAccessFile splitSmallRandomAccessFile=new RandomAccessFile(splitSmallFileList.get(i), "rw");
splitRandomAccessFile.seek(splitSmallFileBeginPos);
byte[] cache=new byte[1024*10];
int len=-1;
while((len=splitRandomAccessFile.read(cache))!=-1) {
if (splitSmallFileActualSize>len) {
splitSmallRandomAccessFile.write(cache,0,len);
splitSmallFileActualSize-=len;
}else {
splitSmallRandomAccessFile.write(cache,0,(int)splitSmallFileActualSize);
break;
}
}
splitRandomAccessFile.close();
splitSmallRandomAccessFile.close();
} catch (FileNotFoundException e) {
throw new RuntimeException("文件未找到",e);
} catch (IOException e) {
throw new RuntimeException("文件传输异常",e);
}
}
return splitSmallFileList;
}
public String merge(List<String> splitSmallFileList,String mergeFileDir,String mergeFileName) {
try {
StringBuilder stringBuilder=new StringBuilder();
stringBuilder.append(mergeFileDir).append("/").append(mergeFileName);
String newMergeFile=stringBuilder.toString();
OutputStream outputStream=new BufferedOutputStream(new FileOutputStream(newMergeFile,true));
Vector<InputStream> vector=new Vector<InputStream>();
for (int i = 0; i < splitSmallFileList.size(); i++) {
vector.add(new BufferedInputStream(new FileInputStream(splitSmallFileList.get(i))));
}
SequenceInputStream sequenceInputStream=new SequenceInputStream(vector.elements());
byte[] cache=new byte[1024*10];
int len=-1;
while ((len=sequenceInputStream.read(cache))!=-1) {
outputStream.write(cache,0,len);
}
outputStream.flush();
outputStream.close();
sequenceInputStream.close();
return newMergeFile;
} catch (FileNotFoundException e) {
throw new RuntimeException("文件未找到",e);
} catch (IOException e) {
throw new RuntimeException("文件传输异常",e);
}
}
public static void main(String[] args) {
SplitAndMergeFile splitAndMergeFile=new SplitAndMergeFile();
List<String> splitList = splitAndMergeFile.split(new File("mat.png"), "splitSmallFilesDir", 1024);
System.out.println(splitList);
String newMergeFile = splitAndMergeFile.merge(splitList, "mergeFileDir", "matMerge.png");
System.out.println(newMergeFile);
}
}
输出结果:
[splitSmallFilesDir/0_mat.png, splitSmallFilesDir/1_mat.png, splitSmallFilesDir/2_mat.png]
mergeFileDir/matMerge.png