package cn.mytext.ref;
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.PrintStream;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Properties;
public class SplitFile {
public static void main(String[] args) throws IOException {
String src = "d:\\1.bmp";
splitFile(src);
}
//根据指定的份数分割文件
private static void splitFile(String fileName) throws IOException {
File src = new File(fileName);//获取源文件
if(!src.exists())//判断源文件是否存在
{
throw new RuntimeException("文件不存在");
}
long src_size = src.length();//获取源文件的大小
long split_size = src_size / 3;//获取分割后每一份文件的大小
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(src));//实例化缓冲输入流对象
BufferedOutputStream bos = null;//声明名缓冲输出流
int len = 0;//读取到文件大小
byte[] buf = new byte[1024*1024];//定义缓冲区
String src_name = src.getName()+"-";//获取源文件名
File dest = new File("d:\\Image");//输出文件的目录
File config = new File(dest,"config.properties");//声明配置文件
if(!config.exists())//判断配置文件是否存在
{
config.createNewFile();//创建配置文件
}
Properties prop = new Properties();//配置文件集合
int count = 1;//记录当前文件的分数
File new_file = null;
System.out.println("开始分割文件");
//进行读写操作
while((len = bis.read(buf))!=-1)//读取数据
{
if(new_file == null)//判断输出文件是否被实例化
{
new_file = new File(dest,src_name+count+".part");//创建分割文件
bos = new BufferedOutputStream(new FileOutputStream(new_file));//输出流与分割文件相关联
prop.setProperty(Integer.toString(count), new_file.getName());//定义集合的建和值
}
if(new_file.length()>=split_size)//判断当前的分割文件是否达到定义分割的大小
{
System.out.println(new_file.getName()+":done");//打印当前完成的分割文件
count++;//为新创建的分割文件序号+1
new_file = new File(dest,src_name+count+".part");//创建新的分割文件
bos = new BufferedOutputStream(new FileOutputStream(new_file));//输出流与分割文件相关联
prop.setProperty(Integer.toString(count), new_file.getName());//定义集合的建和值
}
bos.write(buf, 0, len);//写入数据
bos.flush();//刷新缓冲区
}
if(len == -1)//由于最后一份有可能小于分割的大小,导致无法打印。
{
System.out.println(new_file.getName()+":done");//打印当前完成的分割文件
}
//关闭流
bos.close();
bis.close();
//把集合的信息持久化
prop.store(new FileOutputStream(config), "config_file");
}
//合并文件
private static void mergeFile(String dest,String pro_file) throws FileNotFoundException, IOException {
//1,获取配置文件
File destFile = new File(dest);//获取给定目录
File config = new File(dest,pro_file);//获取配置文件
//2,将配置文件的信息读取到集合中
Properties prop = new Properties();//创建配置文件集合
prop.load(new FileInputStream(config));//集合与配置文件相关联
//3,获取对应键的值
System.out.println(prop.size());//打印当前集合的长度
String srcFileName = (String)prop.get("1");//获取源文件名
srcFileName = srcFileName.substring(0, srcFileName.lastIndexOf("-"));//截取文件名
File srcFile = new File(new File(dest),srcFileName);//创建合并后的文件
if(!srcFile.exists())//判断文件是否存在
{
srcFile.createNewFile();//不存在则创建
}
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(srcFile));//合成文件与输出流相关联
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();//创建集合对象
String file_num = new String();//定义读取的键
for(int i = 1; i<= prop.size(); i++)
{
file_num = Integer.toString(i);
String file_name = (String)prop.get(file_num);//根据相应的键获取对应的值
System.out.println(file_name);//打印当前的值
File part_file = new File(destFile,file_name);//获取对应键的文件名
al.add(new FileInputStream(part_file));//将新加输入文件流添加到集合
}
//4,获取值信息是使用流合并
Enumeration<FileInputStream> en = Collections.enumeration(al);
SequenceInputStream sis = new SequenceInputStream(en);
byte[] buf = new byte[1024];
int len = 0;
while((len = sis.read(buf))!=-1)
{
bos.write(buf, 0, len);
bos.flush();
}
bos.close();
sis.close();
}
}
原文地址:http://10110315.blog.51cto.com/10100315/1630713