import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
/**
* SplitFile.java
* @author:<a href="mailto:bylv@isoftstone.com">bylv</a>
* @DATE:2015-9-7 上午09:27:43
* Copyright (C) 2011 ISoftStone
*/
/**
* 功能说明:
*
* @author: <a href="mailto:bylv@isoftstone.com">bylv</a>
* @DATE:2015-9-7 @TIME: 上午09:27:43
*/
public class SplitFile {
private static final int SIZE = 1024 * 1024;// 定义单个文件的大小这里采用1m
/**
* 功能说明:
*
* @param args
* @author: <a href="mailto:bylv@isoftstone.com">bylv</a>
* @throws Exception
* @DATE:2015-9-7 @TIME: 上午09:27:44
*/
public static void main(String[] args) throws Exception {
// 拆分
// File file = new File("D:/无标题.bmp");
// splitFile(file);
// 合并
File file = new File("C:/parfiles");
mergeFile(file);
}
/**
* 功能说明:合并文件
*
* @param file
* @author: <a href="mailto:bylv@isoftstone.com">bylv</a>
* @throws Exception
* @throws FileNotFoundException
* @DATE:2015-9-7 @TIME: 上午09:47:31
*/
private static void mergeFile(File dir) throws Exception {
// 读取properties文件的拆分信息
File[] files = dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".properties");
}
});
File file = files[0];
// 获取该文件的信息
Properties pro = new Properties();
FileInputStream fis = new FileInputStream(file);
pro.load(fis);
String fileName = pro.getProperty("fileName");
int splitCount = Integer.valueOf(pro.getProperty("partCount"));
if (files.length != 1) {
throw new Exception(dir + ",该目录下没有解析的properties文件或不唯一");
}
// 获取该目录下所有的碎片文件
File[] partFiles = dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".part");
}
});
// 将碎片文件存入到集合中
List<FileInputStream> al = new ArrayList<FileInputStream>();
for (int i = 0; i < splitCount; i++) {
try {
al.add(new FileInputStream(partFiles[i]));
} catch (Exception e) {
// 异常
e.printStackTrace();
}
}
try {
// 构建文件流集合
Enumeration<FileInputStream> en = Collections.enumeration(al);
// 将多个流合成序列流
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream(new File(dir, fileName));
byte[] b = new byte[1024];
int len = 0;
while ((len = sis.read(b)) != -1) {
fos.write(b, 0, len);
}
fos.close();
sis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 功能说明:拆分文件
*
* @param file
* @author: <a href="mailto:bylv@isoftstone.com">bylv</a>
* @DATE:2015-9-7 @TIME: 上午09:28:58
*/
private static void splitFile(File file) {
try {
FileInputStream fs = new FileInputStream(file);
// 定义缓冲区
byte[] b = new byte[SIZE];
FileOutputStream fo = null;
int len = 0;
int count = 0;
/**
* 切割文件时,记录 切割文件的名称和切割的子文件个数以方便合并
* 这个信息为了简单描述,使用键值对的方式,用到了properties对象
*/
Properties pro = new Properties();
// 定义输出的文件夹路径
File dir = new File("C:/parfiles");
// 判断文件夹是否存在,不存在则创建
if (!dir.exists()) {
dir.mkdirs();
}
// 切割文件
while ((len = fs.read(b)) != -1) {
fo = new FileOutputStream(new File(dir, (count++) + ".part"));
fo.write(b, 0, len);
fo.close();
}
// 将被切割的文件信息保存到properties中
pro.setProperty("partCount", count + "");
pro.setProperty("fileName", file.getName());
fo = new FileOutputStream(new File(dir, (count++) + ".properties"));
// 写入properties文件
pro.store(fo, "save file info");
fo.close();
fs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
转载于:https://my.oschina.net/kkrgwbj/blog/502033