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