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();

}

}