操作Zip压缩文件

解Zip压缩文件

  使用ZipInputStream解压文件流,先创建一个ZipInputStream对象,传入FileInputStream作为数据源,再利用getNextEntry()方法存入一个个ZipEntry对象中,一个ZipEntry表示一个压缩文件或目录,判断ZipEntry对象如果是目录则创建子目录,如果是文件,则创建子文件,并读取当前压缩包中的子文件,通过输出流out写入新子文件中

注意:创建根目录时要判断创建的源文件下根目录是否已经存在,若存在,使用commons-io包提供的FilesUntils工具类进行删除。

解rar压缩文件

  创建Archive对象,用于读取rar压缩文件格式,传入FileInputStream作为数据源,将获取到底压缩文件中的所有子目录或子文件存入List集合中,遍历集合中的子目录和子文件,如果是目录,则创建子目录,如果是文件,则创建子文件,获取压缩包所在的子文件输入流,通过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 demo02 {
	public static void main(String[] args) {
		String path="C:\\Users\\x'z\\Documents\\Tencent Files\\1035195870\\FileRecv\\实验案例.rar";
		if(path.endsWith(".zip")) {
			unzip(path);
		}else if(path.endsWith(".rar")) {
			unrar(path);
		}
	}
	//解压缩zip格式
	public static void unzip(String path) {
		//跟据原始路径(字符串),创建源文件(File对象)
		File sourceFile=new File(path);
		String soureFileName=sourceFile.getName();
		//根目录
		File rootDir=new File(sourceFile.getParent()+"\\"+soureFileName.substring(0, soureFileName.lastIndexOf(".")));
		//判断根目录是否已经存在
		if(rootDir.exists()) {
			//如果存在,删除
			//rootDir.delete();仅能删除空目录
			try {
				//使用commons-io包提供的FilesUntils工具类进行删除
				FileUtils.deleteDirectory(rootDir);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				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写入新子文件中
					
					try(FileOutputStream out=new FileOutputStream(file);){
					byte[] buff=new byte[1024];
					int len=-1;
						while((len=in.read())!=-1) {
							out.write(buff,0,len);
						}
					}
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	//解压缩rar格式
	public static void unrar(String path) {
		File rarFile=new File(path);
		File rootDir=new File(rarFile.getParent()+"\\"+rarFile.getName().substring(0, rarFile.getName().lastIndexOf(".rar")));
		if(rootDir.exists()) {
			try {
				FileUtils.deleteDirectory(rootDir);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		rootDir.mkdir();
		//创建Archive对象,用于读取rar压缩文件格式
		try (Archive archive = new Archive(new FileInputStream(path))) {
			
			//获取压缩文件中的所有子目录或子文件
			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);
				}
			//	System.out.println(fd.getFileName());
			}
			
		} catch (RarException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

压缩文件为Zip格式

 使用ZipOutputStream写入文件流,先创建一个ZipOutputStream对象,传入FileInputStream作为数据源,再利用putNextEntry()方法存入一个个ZipEntry对象中,然后用write()方法写入字节内容,最后调用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 demo05 {
	public static void main(String[] args) {
		//所在目录
		File dir=new File("C:\\Users\\x'z\\Pictures\\Saved Pictures");
		
		//获取所有原始文件
		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();
		}
	}
}

 

 

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以使用ZipOutputStream类来实现zip压缩文件的功能,以下是一个简单的示例代码: ```java import java.io.*; import java.util.zip.*; public class ZipDemo { public static void main(String[] args) throws IOException { String sourceFile = "source.txt"; // 待压缩文件 String zipFile = "compressed.zip"; // 压缩后的文件名 FileOutputStream fos = new FileOutputStream(zipFile); ZipOutputStream zipOut = new ZipOutputStream(fos); File fileToZip = new File(sourceFile); FileInputStream fis = new FileInputStream(fileToZip); ZipEntry zipEntry = new ZipEntry(fileToZip.getName()); zipOut.putNextEntry(zipEntry); byte[] bytes = new byte[1024]; int length; while ((length = fis.read(bytes)) >= 0) { zipOut.write(bytes, 0, length); } zipOut.close(); fis.close(); fos.close(); } } ``` 该程序将会读取一个名为source.txt的文件,将其压缩成名为compressed.zipzip文件。程序中使用了Java的IO流和ZipOutputStream类来完成压缩操作,具体实现过程如下: 1. 创建一个ZipOutputStream对象,用于向压缩文件中写入数据。 2. 读取需要压缩的文件。 3. 创建一个ZipEntry对象,用于描述待压缩文件的名称和属性。 4. 将ZipEntry对象写入ZipOutputStream中。 5. 循环读取待压缩文件的内容,并将其写入ZipOutputStream中。 6. 关闭ZipOutputStream与输入流。 7. 压缩完成。 需要注意的是,Java中还有许多其他的压缩方式和库,例如GZIP、JAR等,可以根据需要选择适当的方式来完成压缩操作

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值