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