IO流之文件切割,文件合并 Java

现有一要求,将桌面的一个指定PPT按照大小为1MB进行切割,将切割完的文件及配置文件放在一个目录中

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class test 
{
    public static void main(String[] args) throws IOException
    {
        File file=new File("C:\\Users\\fan\\Desktop\\product.PPT");
        splitFile(file);

    }
    public static void splitFile(File file) throws IOException
    {
        //byte数组长度为1024*1024,数组装满后大小就为1MB
        final int size=1024*1024;
        //将配置信息放入properties容器中
        Properties pro=new Properties();
        //用读取流关联源文件
        FileInputStream fis=new FileInputStream(file);

        //自定义缓冲数组
        byte[] buf=new byte[size];

        //创建目的
        FileOutputStream fos=null;

        int len=0;
        int count=1;
        //声明一个用于存放切割文件的目录
        File dir=new File("c:\\users\\fan\\desktop\\partfiles");
        //若目录不存在,创建之
        if(!dir.exists())
            dir.mkdirs();
        while((len=fis.read(buf))!=-1)
        {
            fos=new FileOutputStream(new File(dir,(count++)+".part"));
            fos.write(buf,0,len);
            fos.close();
        }
        pro.setProperty("partcount",count+"");
        pro.setProperty("filename",file.getName());
        fos=new FileOutputStream(new File(dir,count+".properties"));
        pro.store(fos,"save");

        fos.close();
        fis.close();

    }
}

 将文件切割了,那怎么吧切割完的文件合并呢?下面代码实现了将切割文件合并的功能

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Properties;

public class MergeFile  {
    public static void main(String[] args) throws IOException
    {
        File dir=new File("C:\\Users\\fan\\Desktop\\partfiles");
        mergeFile(dir);
    }
    public static void mergeFile(File dir) throws IOException
    {
        //获取指定目录下的配置文件
        File[] confiles=dir.listFiles(new nameFilter("properties"));
        if (confiles.length!=1)
            throw new RuntimeException("配置文件不唯一,不能合并");
        
        File confile=confiles[0];
        
        FileInputStream fis=new FileInputStream(confile);
        Properties pro=new Properties();
        pro.load(fis);
        fis.close();
        int clipFileCount=Integer.parseInt(pro.getProperty("partcount"));
        String filename=pro.getProperty("filename");
        
        //获取该目录下所有碎片文件
        File[] clipFile=dir.listFiles(new nameFilter("part"));
        if(clipFileCount-1!=clipFile.length)
            throw new RuntimeException("碎片文件个数不对,无法合并");
        //用集合吧获取到的碎片文件装起来
        ArrayList<FileInputStream> al=new ArrayList<>();
        for(int i=0;i<clipFileCount-1;i++)
            al.add(new FileInputStream(clipFile[i]));
        //声明一个枚举
        Enumeration<FileInputStream> en=Collections.enumeration(al);
        SequenceInputStream sis=new SequenceInputStream(en);
        //读取序列流中的数据
        byte[] buf=new byte[1024];
        int len=0;
        //将读到的数据写入目的文件
        FileOutputStream fos=new FileOutputStream(new File(dir,filename));
        while((len=sis.read(buf))!=-1)
        {
            fos.write(buf, 0, len);
        }
      sis.close();
      fos.close();
} }
//过滤器 class nameFilter implements FilenameFilter { private String suffix; public nameFilter(String suffix) { this.suffix=suffix; } @Override public boolean accept(File dir, String name) { // TODO Auto-generated method stub return name.endsWith(suffix); } }

 

posted on 2018-06-05 23:10  yfyfyf947  阅读(339)  评论(0编辑  收藏  举报