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