如何处理压缩文件

一、将zip和rar文件解压缩

解压缩zip格式步骤:

1.根据原始路径,创建源文件(File对象)

2.创建根目录对象,传入源文件的根目录(父级对象\\源文件名)

3.判断根目录是否存在(用exists()方法)

        若存在,则删除:

                rootDir.delete():仅能删除空目录;

                common-io包提供的FileUtils工具中的deleteDirectory()方法进行非空白目录删除。

        若不存在,则创建根目录:

                rootDir.mkdir():即产生一个与压缩文件同名的空文件夹。

4.用ZipInputStream对象进行zip格式的压缩文件输入流

        1>创建一个ZipInputStream的对象,将FileInputStream类型的对象作为数据源;

        2>压缩包中的每个子目录或子文件都是ZipEntry类型的对象,遍历一遍;

        通过ZipInputStream对象调用getNextEntry()方法获取文件流:

                创建子目录或子文件;

                如果ZipEntry类型的对象是目录,则创建子目录:file.mkdir();

                如果ZipEntry类型的对象是文件,则创建子文件:file.createNewFile();

                        读取当前压缩包中的子文件,并通过输出流out写入子文件中(每次读取1024个字节)。


解压缩rar格式步骤:

1.根据原始路径,创建源文件(File对象)

2.创建根目录对象,传入源文件的根目录(父级对象\\源文件名)

3.判断根目录是否存在(用exists()方法)

        若存在,则删除;

        若不存在,则创建根目录。

4.用Archive对象进行rar格式的压缩文件输入流

        1>创建一个Archive的对象,将FileInputStream类型的对象作为数据源;

        2>获取压缩文件中的所有子目录或子文件(FileHeader对象)(List集合

        3>按照子目录(子文件)排序

        4>遍历子目录和子文件(遍历List集合)

                创建子目录或子文件;

                如果FileHeader类型的对象是目录,则创建子目录:file.mkdir();

                如果FileHeader类型的对象是文件,则创建子文件:file.createNewFile()、获取压缩包中的子文件输入流(getInputStream()方法)、复制文件输入流至新子文件(FileUtils.copyInputStreamToFile()方法)。

具体代码实现如下: 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Comparator;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import org.apache.commons.io.FileUtils;

import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.rarfile.FileHeader;

public class Test{
	public static void main(String[] args) {
        String path="D:\\QQ文件\\文件\\easyftp-server-1.7.0.10-cn.zip";
        if(path.endsWith(".zip")) {
            unzip(path);
        }else if(path.endsWith(".rar")) {
        	unrar(path);
        }
    }
	
	//解压缩zip格式
	public static void unzip(String path) {
		File sourceFile=new File(path);
		
		String sourceFileName=sourceFile.getName();
		File rootDir=new File(sourceFile.getParent()+"\\"
		+sourceFileName.substring(0, sourceFileName.lastIndexOf(".")));
		
		//判断根目录是否已经存在
		if(rootDir.exists()) {
			
			//使用common-io包提供的FileUtils工具类进行删除
			try {
				FileUtils.deleteDirectory(rootDir);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		//创建根目录
		rootDir.mkdir();
		
		//ZipInputStream:用于进行zip格式的压缩文件输入流
		try (ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile))) {
			//遍历压缩包中的每个子目录或子文件(ZipEntry类型的对象)
			ZipEntry zipEntry=null;
			while((zipEntry=in.getNextEntry())!=null) {
				//创建子目录或子文件(File对象)
				File file=new File(rootDir.getPath()+"\\"+zipEntry.getName());
				if(zipEntry.isDirectory()) {
					//物理磁盘创建子目录
					file.mkdir();
				}else {
					//物理磁盘创建子文件
					file.createNewFile();
					
					//读取当前压缩包中的子文件,并通过输出流out写入子文件中
					FileOutputStream out=new FileOutputStream(file);
					byte[] buff=new byte[1024];
					int len=-1;
					while((len=in.read(buff))!=-1) {
						out.write(buff, 0, len);
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	//解压缩rar格式
	private static void unrar(String path) {
		//创建与压缩同名的根目录
		File rarFile=new File(path);
		File rootDir=new File(rarFile.getParent()+"\\"+
				rarFile.getName().substring(0, rarFile.getName().lastIndexOf(".")));
		//判断根目录是否已经存在
		if(rootDir.exists()) {
			try {
				FileUtils.deleteDirectory(rootDir);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		rootDir.mkdir();
		
		//Archive:用于读取rar压缩文件格式
		try (Archive archive = new Archive(new FileInputStream(path))) {
			//获取压缩文件中的所有子目录或子文件(FileHeader对象)
			List<FileHeader> fileheaderList=archive.getFileHeaders();
			//按照子目录(子文件)排序
			fileheaderList.sort(new Comparator<FileHeader>() {

				@Override
				public int compare(FileHeader o1, FileHeader o2) {
					return o1.getFileName().compareTo(o2.getFileName());
				}
			});
			//遍历子目录和子文件
			for(FileHeader fd:fileheaderList) {
				File f=new File(rootDir.getPath()+"\\"+fd.getFileName());
				if(fd.isDirectory()) {
					//创建新子目录
					f.mkdir();
				}else {
					//创建新子文件
					f.createNewFile();
					//获取压缩包中的子文件输入流
					InputStream in=archive.getInputStream(fd);
					//复制文件输入流至新子文件
					FileUtils.copyInputStreamToFile(in, f);
				}
			}
		} catch (RarException | IOException e) {
			e.printStackTrace();
		}	
	}
}

二、将文件压缩为zip文件

1.创建File对象,引用源文件路径;

2.调用listFiles方法,获取原始所有子文件,保存在File数组中;

3.创建Zip压缩文件的输出流

        创建一个ZipOutputStream的对象,将FileOutputStream类型的对象作为数据源;

        遍历所有的原始子文件:

                每循环一次创建一个ZipEntry类型的对象,写入一个压缩包的子文件(调用putNextEntry方法);

                写入所有的字节内容;

               注:使用closeEntry方法关闭压缩包的文件。

具体代码实现如下:  

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Test{
	public static void main(String[] args) {
		//所在目录
		File dir=new File("D:\\TEXT\\copy");
		//获取原始所有子文件
		File[] files=dir.listFiles();
		//创建zip压缩文件的输出流
		try (ZipOutputStream out = new ZipOutputStream(
				new FileOutputStream(dir.getPath()+"\\"+dir.getName()+".zip"))) {
			//遍历所有原始子文件
			for(File f:files) {
				//写入一个压缩包中的子文件(ZipEntry对象)
				out.putNextEntry(new ZipEntry(f.getName()));
				//写入字节内容
				out.write(Files.readAllBytes(f.toPath()));
				//关闭压缩包中的文件
				out.closeEntry();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值