java 分割与合并小文件

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值