package net.zhh.zip;
import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.FileReader;
 import java.io.IOException;import org.apache.taglibs.standard.tag.common.core.CatchTag;
public class DivideZip {
  public static final String SUFFIX = ".rar"; // 分割后的文件名后缀
  // 将指定的文件按着给定的文件的字节数进行分割文件,其中name指的是需要进行分割的文件名,num指的是指定分割的文件数
  public static boolean divide(String name, int num) {
    //处理每个小文件的大小
   boolean isSucess=true;
   long[] size=new long[2];
   File file = new File(name);
   if (!file.exists() || (!file.isFile())) {
    isSucess=false;
    return isSucess;
   }
   // 获得被分割文件父文件,将来被分割成的小文件便存在这个目录下
   File parentFile = file.getParentFile();
   System.out.println("被分割文件父文件为parentFile="+parentFile);
   // 取得文件的大小
   long fileLength = file.length();//此抽象路径名表示的文件的长度,以字节为单位:返回的是字节数
   System.out.println("此文件的字节数fileLength="+fileLength);  if(fileLength % num != 0){
    long l=(long)(fileLength/num);
    size[0]=l;//前num-1个文件的大小
    size[1]=(long)(fileLength-l*(num-1));//最后一个文件的大小
    
   }else{
     size[0]=(long)(fileLength/num);//每个小文件的大小
     size[1]=(long)(fileLength/num);//每个小文件的大小
   }
   // 存放被分割后的小文件名
   System.out.println("文件的大小为:"+fileLength+",前num-1个文件的大小size[0]="+size[0]+",最后一个文件的大小size[1]"+size[1]);
   String[] fileNames = new String[num];
   // 输入文件流,即被分割的文件
   try{
   FileInputStream in = new FileInputStream(file);
   // 读输入文件流的开始和结束下标
   long end = 0;
   int begin = 0;
   // 根据要分割的数目输出文件  byte[] b=new byte[1024*1024*10];
   
   for (int i = 0; i < num; i++) {
    File outFile = new File(parentFile, file.getName() + i + SUFFIX);//parentFile 抽象路径名用于表示目录,后一个参数用于表示目录或文件
    // 构建小文件的输出流
    FileOutputStream out = new FileOutputStream(outFile);
    // 将结束下标后移size
    
    if(i!=num-1){ // 对于前num - 1个小文件,大小都为指定的size[0]
     byte[] bb=new byte[1024];
     long li_restBy=(long)(size[0]);
     int m=(int)(li_restBy/bb.length);
     System.out.println("循环的次数为:"+m);
     if(li_restBy>1024){//处理大于1M的情况
      System.out.println("处理大于1K的情况");
      //循环的为1M的整数倍
      for(int j=0;j<m;j++){//循环的次数为
       in.read(bb);
       out.write(bb,0,bb.length);
      // System.out.println("运行到这"+j);
      }
      System.out.println("处理小于1K的情况");
     //循环的为1M以下的。
      int k=(int)(li_restBy%bb.length);
      System.out.println("剩余的字节数为:"+k);
      for(int j=0;j<k;j++){
        out.write(in.read());//读取剩余的字节数到输出流 
       // System.out.println("循环开始"+j);
     
      }
     }else{//处理剩下的1K的情况
      int k=(int)(li_restBy%bb.length);
      System.out.println("剩余的字节数为:"+k);
      for(int j=0;j<k;j++){
        out.write(in.read());//读取剩余的字节数到输出流 
       // System.out.println("循环开始"+j);
     
      }
     }
    }else{
     System.out.println("处理最后一个文件");
     byte[] bb=new byte[1024];
     long li_restBy=(long)(size[1]);
     System.out.println("最后一个文件大小为:"+size[1]+"前几个文件大小为:"+size[0]);
     int m=(int)(li_restBy/bb.length);
     System.out.println("循环的次数为:"+m);
     if(li_restBy>1024){//处理大于1M的情况
      System.out.println("处理大于1K的情况");
      //循环的为1M的整数倍
      for(int j=0;j<m;j++){//循环的次数为
       in.read(bb);
       out.write(bb,0,bb.length);
      // System.out.println("运行到这"+j);
      }
      System.out.println("处理小于1K的情况");
     //循环的为1M以下的。     
      int k=(int)(li_restBy%bb.length);
      System.out.println("剩余的字节数为:"+k);
      for(int j=0;j<k;j++){
        out.write(in.read());//读取剩余的字节数到输出流 
      //  System.out.println("循环开始"+j);
     
      }
     }else{//处理剩下的1K的情况
      int k=(int)(li_restBy%bb.length);
      System.out.println("剩余的字节数为:"+k);
      for(int j=0;j<k;j++){
        out.write(in.read());//读取剩余的字节数到输出流 
       // System.out.println("循环开始"+j);
     
      }
     }
    }
    out.close();
    fileNames[i] = outFile.getAbsolutePath();
   }
   in.close();
   }catch(Exception e){
    isSucess=false;
   }
   return isSucess;
  }
  public static boolean divide(String name, int num) { //按大小 分割数据
    //处理每个小文件的大小
   boolean isSucess=true;
   long[] size=new long[2];
   File file = new File(name);
   if (!file.exists() || (!file.isFile())) {
    isSucess=false;
    return isSucess;
   }
   // 获得被分割文件父文件,将来被分割成的小文件便存在这个目录下
   File parentFile = file.getParentFile();
   System.out.println("被分割文件父文件为parentFile="+parentFile);
   // 取得文件的大小
   long fileLength = file.length();//此抽象路径名表示的文件的长度,以字节为单位:返回的是字节数
   System.out.println("此文件的字节数fileLength="+fileLength);
 //------------------ //按大小 分割数据-----------------------------------------------------------------------------
   if(fileLength % num != 0){
    long l=(long)(fileLength/num);
    size[0]=l;//前num-1个文件的大小
    size[1]=(long)(fileLength-l*(num-1));//最后一个文件的大小
    
   }else{
     size[0]=(long)(fileLength/num);//每个小文件的大小
     size[1]=(long)(fileLength/num);//每个小文件的大小
   }
   // 存放被分割后的小文件名
   System.out.println("文件的大小为:"+fileLength+",前num-1个文件的大小size[0]="+size[0]+",最后一个文件的大小size[1]"+size[1]);
   String[] fileNames = new String[num];
   // 输入文件流,即被分割的文件
   try{
   FileInputStream in = new FileInputStream(file);
   // 读输入文件流的开始和结束下标
   long end = 0;
   int begin = 0;
   // 根据要分割的数目输出文件  byte[] b=new byte[1024*1024*10];
   
   for (int i = 0; i < num; i++) {
    File outFile = new File(parentFile, file.getName() + i + SUFFIX);//parentFile 抽象路径名用于表示目录,后一个参数用于表示目录或文件
    // 构建小文件的输出流
    FileOutputStream out = new FileOutputStream(outFile);
    // 将结束下标后移size
    
    if(i!=num-1){ // 对于前num - 1个小文件,大小都为指定的size[0]
     byte[] bb=new byte[1024];
     long li_restBy=(long)(size[0]);
     int m=(int)(li_restBy/bb.length);
     System.out.println("循环的次数为:"+m);
     if(li_restBy>1024){//处理大于1M的情况
      System.out.println("处理大于1K的情况");
      //循环的为1M的整数倍
      for(int j=0;j<m;j++){//循环的次数为
       in.read(bb);
       out.write(bb,0,bb.length);
      // System.out.println("运行到这"+j);
      }
      System.out.println("处理小于1K的情况");
     //循环的为1M以下的。
      int k=(int)(li_restBy%bb.length);
      System.out.println("剩余的字节数为:"+k);
      for(int j=0;j<k;j++){
        out.write(in.read());//读取剩余的字节数到输出流 
       // System.out.println("循环开始"+j);
     
      }
     }else{//处理剩下的1K的情况
      int k=(int)(li_restBy%bb.length);
      System.out.println("剩余的字节数为:"+k);
      for(int j=0;j<k;j++){
        out.write(in.read());//读取剩余的字节数到输出流 
       // System.out.println("循环开始"+j);
     
      }
     }
    }else{
     System.out.println("处理最后一个文件");
     byte[] bb=new byte[1024];
     long li_restBy=(long)(size[1]);
     System.out.println("最后一个文件大小为:"+size[1]+"前几个文件大小为:"+size[0]);
     int m=(int)(li_restBy/bb.length);
     System.out.println("循环的次数为:"+m);
     if(li_restBy>1024){//处理大于1M的情况
      System.out.println("处理大于1K的情况");
      //循环的为1M的整数倍
      for(int j=0;j<m;j++){//循环的次数为
       in.read(bb);
       out.write(bb,0,bb.length);
      // System.out.println("运行到这"+j);
      }
      System.out.println("处理小于1K的情况");
     //循环的为1M以下的。     
      int k=(int)(li_restBy%bb.length);
      System.out.println("剩余的字节数为:"+k);
      for(int j=0;j<k;j++){
        out.write(in.read());//读取剩余的字节数到输出流 
      //  System.out.println("循环开始"+j);
     
      }
     }else{//处理剩下的1K的情况
      int k=(int)(li_restBy%bb.length);
      System.out.println("剩余的字节数为:"+k);
      for(int j=0;j<k;j++){
        out.write(in.read());//读取剩余的字节数到输出流 
       // System.out.println("循环开始"+j);
     
      }
     }
    }
    out.close();
    fileNames[i] = outFile.getAbsolutePath();
   }
   in.close();
   }catch(Exception e){
    isSucess=false;
   }
   return isSucess;
  } public static void readFileMessage(String[] fileName) throws Exception {// 将分割成的小文件中的内容读出      
     byte buffer[]=new byte[1024*1024];  
     int readcount; 
     File ss=new File("D:\\zipComp\\aaa.rar");
     ss.createNewFile();
    FileOutputStream writer=new FileOutputStream(ss);  //合并的文件              
      for(int i=0;i<fileName.length;i++){ 
                System.out.println("开始处理第"+(i+1)+"个文件");
        FileInputStream in=new FileInputStream(new File(fileName[i])); 
      
       byte[] bb=new byte[1024];
       System.out.println("剩余的字节数为:"+in.available());
       int li_restBy=in.available();
       int m=li_restBy/bb.length;
       int k=li_restBy%bb.length;
       System.out.println("循环的次数为:"+m);
       if(li_restBy>1024){//处理大于1k的情况
        System.out.println("处理大于1K的情况");
        //循环的为1M的整数倍
        for(int j=0;j<m;j++){//循环的次数为
         in.read(bb);
         writer.write(bb,0,bb.length);
        }
        System.out.println("处理小于1K的情况");
       //循环的为1M以下的。
        System.out.println("剩余的字节数为:"+k);
       
        for(int j=0;j<k;j++){
        writer.write(in.read());//读取剩余的字节数到输出流 
        //  System.out.println("循环开始"+j);
       
        }
      } 
      in.close();
      }
          writer.close();        
  }
  public static void main(final String[] args) throws Exception {
    String name = "D:\\zipComp\\a.rar";
  int num=6;
    //String[] fileNames = TestZipTest.divide(name, size);
  boolean boo = DivideZip.divide(name, num);//分为4个文件
  System.out.println(boo);
  
   }
 }