下面是自己写的代码
- package IO;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.SequenceInputStream;
- import java.util.ArrayList;
- import java.util.Enumeration;
- import java.util.Iterator;
- import java.util.List;
- /**
- * 合并分割文件
- *
- *
- *
- *
- * @author Administrator
- *
- */
- public class SplitFile {
- public static void main(String[] args) throws IOException{
- //要分割的文件
- File file=new File("1.jpg");
- int jpg=5;
- split(file, jpg);
- merge("合并后的图片.jpg","1.part","2.part","3.part","4.part","5.part");
- }
- //分割文件,file要分割的文件,jpg分割成多少份
- public static void split(File file,int part) throws IOException{
-
- //自定义分割成多少个文件后,每个分割文件的最大值
- int partSize=(int)file.length()/part+1;
- //用来接受从文件读取的字节
- byte[] buf=new byte[1024];
- //从文件读取了多少个字节
- int len=0;
- //当前分割文件的大小
- int size=0;
- //每次动态创建文件的名字
- int i=1;
- //输入流,读取要分割文件的字节
- FileInputStream fis=new FileInputStream(file);
- //输出流,写到分割文件的输出流
- FileOutputStream fos=new FileOutputStream(i+".part");
- //读取源文件
- while((len=fis.read(buf))!=-1){
- //写入buf字节数组后,分割文件的大小
- size+=len;
- //如果分割文件的最大值 > 即将写入buf后分割文件的实际大小
- if(size<=partSize){
- //将buf写入到分割文件中
- fos.write(buf);
- }
- //否则
- else{
- //把分割文件写满,从buf的第一个元素开始,写len-(size-partSize)个元素
- fos.write(buf, 0, len-(size-partSize));
- //关闭输出流
- fos.close();
- //创建新输出流,
- fos=new FileOutputStream(++i+".part");
- //把buf中未被写入的部分,写入到新建的分割文件中
- fos.write(buf, len-(size-partSize), size-partSize);
- //将size设置成已写入分割文件的字节数
- size=size-partSize;
- }
- //当前buf已经全部写出去了,读取下一个buf
- }
- //源文件全部读取完毕,不需要读取了,关闭输入流
- fis.close();
- //关闭最后一个创建的输出流
- fos.close();
- }
- //合并分割文件,desPath合并后的文件,filePath需要合并的文件
- public static void merge(String desPath,String... filePaths) throws IOException{
- //得到参数中的文件输入流,放到集合中
- List<FileInputStream> files=new ArrayList<FileInputStream>();
- for(int i=0;i<filePaths.length;i++){
- File file=new File(filePaths[i]);
- System.out.println(file.getAbsolutePath());
- files.add(new FileInputStream(file));
- }
-
- //使用集合的迭代器
- final Iterator<FileInputStream> it=files.iterator();
- //用内部类实现Enumeration接口,创建enume对象
- Enumeration<FileInputStream> enume=new Enumeration<FileInputStream>() {
-
- @Override
- public FileInputStream nextElement() {
- // TODO Auto-generated method stub
- return it.next();
- }
-
- @Override
- public boolean hasMoreElements() {
- // TODO Auto-generated method stub
- return it.hasNext();
- }
- };
- //使用SequenceInputStream合并输入流,合并分割文件
- SequenceInputStream sequence=new SequenceInputStream(enume);
- FileOutputStream fos=new FileOutputStream(desPath);
- byte[] buf=new byte[1024];
- int len=0;
- while((len=sequence.read(buf))!=-1){
- fos.write(buf, 0, len);
- }
- fos.close();
- sequence.close();
- }
- }
复制代码
|
|