使用RandomAccessFile类可实现文件的分割和合并功能,该类具有在文件任意位置进行读写的功能。例如多线程下载、断点续传等功能都需要用到文件分割和合并。
简单示例如下,不完善之处,请多指教。
public class ImplementsFileCutAndUnite {
/**
*
* @param fileName 源文件
* @param filterFolder 分割文件所在目录
* @param size 每一份大小,以KB为单位
*/
public void cut(String fileName, String filterFolder, int size) {
size = size * 1024;
int maxSize = 0;
File outFolder = new File(filterFolder);
if(!outFolder.exists()) {
outFolder.mkdirs();
}
File inFile = new File(fileName);
// 取得文件的大小
int fileLength = (int) inFile.length();
// 取得要分割的个数
int value = 0;
RandomAccessFile inn = null;
RandomAccessFile outt = null;
try {
// 打开要分割的文件
inn = new RandomAccessFile(inFile, "r");
value = fileLength / size;
int i = 0;
int j = 0;
for(; j < value; j ++) {
File outFile = new File(filterFolder + File.separator + inFile.getName() + j + "tmp");
RandomAccessFile out = new RandomAccessFile(outFile, "rw");
maxSize += size;
for(; i < maxSize; i ++) {
out.write(inn.read());
}
out.close();
}
File outFile = new File(filterFolder + File.separator + inFile.getName() + j + "tmp");
outt = new RandomAccessFile(outFile, "rw");
for(; i < fileLength; i ++) {
outt.write(inn.read());
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
outt.close();
inn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*
* @param fileName 合并之后的文件
* @param filterFolder 分割文件所在目录
* @param filterName 分割后的文件后缀
* @throws Exception
*/
public void unite(String fileName, String filterFolder, final String filterName) throws Exception {
File [] tt;
File inFile = new File(filterFolder); // 在当前目录下的文件
File outFile = new File(fileName); // 取得输出名
RandomAccessFile outt = new RandomAccessFile(outFile, "rw");
tt = inFile.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
String rr = new File(name).toString();
return rr.endsWith(filterName);
}
});
for(int i = 0; i < tt.length; i ++) {
System.out.println(tt[i]);
}
for(int i = 0; i < tt.length; i ++) {
RandomAccessFile inn = new RandomAccessFile(tt[i], "r");
int c = 0;
while((c = inn.read()) != -1) {
outt.write(c);
}
}
outt.close();
}
}