文件的合并与分割

package io;

import java.io.*;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Vector;

/**
 * Created by Lenovo on 2017/11/20.
 */
public class FileMerge {
    public static void main(String[] args) throws IOException{
        String newPath="C:\Users\Lenovo\Desktop\merge.txt";
        String[] files=new String[2];
        files[0]="C:\Users\Lenovo\Desktop\SVN地址、用户名及密码.txt";
        files[1]="C:\Users\Lenovo\Desktop\idea快捷键.txt";
       // merge(newPath,files);
        File f = new File(files[1]);
        split2(f,500);
    }
    //将多个文件合并成一个文件
    public static void merge(String newPath,String[] files) throws IOException {
        //将文件加入序列流
        Vector<FileInputStream> v = new Vector<>();
        for (String file:files) {
            v.add(new FileInputStream(file));
        }
        Enumeration<FileInputStream> elements = v.elements();
        SequenceInputStream sis = new SequenceInputStream(elements);
        //将序列流读取到文件
        FileOutputStream fos = new FileOutputStream(newPath);
        byte[] bytes = new byte[1024];
        int len=0;
        while((len = sis.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }
        fos.close();
        sis.close();
    }
    //将一个文件拆分成多个文件

    //两种思想:一、 一边读流一边写(按照要求)直至全部读完
    public static void split(File srcPath,int eachSize){
        if(srcPath.length() == 0){
            throw  new RuntimeException("该文件不符合规范");
        }
        //将文件读到内存中
        FileInputStream fis=null;
        FileOutputStream fos=null;
        try{
            fis=new FileInputStream(srcPath);
            //写文件
            byte[]bytesnew=new byte[eachSize];
            String filename;
            String[] filePara;
            String srcfilename;
            String prefix;
            int lennew;
            int i=0;
            while ((lennew = fis.read(bytesnew,0,eachSize))!=-1){
                filePara = srcPath.getName().split("\.");
                srcfilename = filePara[0];
                prefix = filePara[1];
                filename=srcfilename+"-"+i+"."+prefix;
                //在当前目录下创建新的文件
                File newfile = new File(srcPath.getParent(),filename);
                //将源文件流进行拆分写入文件
                fos = new FileOutputStream(newfile);
                fos.write(bytesnew,0,lennew);
                i++;
            }
            fis.close();
            fos.close();
        }catch (Exception e){
            e.printStackTrace();
        }

    }
    //二、直接将流全部读到缓存中,将缓存再进行分割,分批写入文件可以用多线程
    public static void split2(File srcPath,int eachSize){
        if(srcPath.length()==0){
            throw  new RuntimeException("该文件不符合规范");
        }
        byte[]bytes=new byte[(int)srcPath.length()];
        FileInputStream fis=null;
        try {
            fis = new FileInputStream(srcPath);
            fis.read(bytes);
            fis.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        //确定将文件拆成分几个文件
        int fileNumber;
        if(bytes.length%eachSize==0){
            fileNumber=bytes.length/eachSize;
        }else{
            fileNumber=bytes.length/eachSize+1;
        }
        //将缓存分批写入文件
        String filename;
        String[] filePara;
        String srcfilename;
        String prefix;
        for(int i=0;i<fileNumber;i++){
            filePara = srcPath.getName().split("\.");
            srcfilename = filePara[0];
            prefix = filePara[1];
            filename=srcfilename+"_"+i+"."+prefix;
            //在当前目录下创建新的文件
            File newfile = new File(srcPath.getParent(),filename);
            byte[] currentbytes;
            if(i != fileNumber-1){
                currentbytes = Arrays.copyOfRange(bytes,eachSize*i,eachSize*(i+1));
            }else{
                currentbytes = Arrays.copyOfRange(bytes,eachSize*i,bytes.length);
            }
            try{
                FileOutputStream fos = new FileOutputStream(newfile);
                fos.write(currentbytes);
                fos.close();
            }catch (Exception e){
                e.printStackTrace();
            }

        }

    }

}
原文地址:https://www.cnblogs.com/zyzg/p/7867352.html