首页 > 编程语言 >使用Java IO进行压缩文件的解析方式

使用Java IO进行压缩文件的解析方式

时间:2024-07-11 19:28:25浏览次数:20  
标签:文件 java IO zip 压缩文件 io Java File import

Java IO库提供了对ZIP解压缩的支持,主要通过java.util.zip包中的类来实现。
ZipEntry:表示ZIP文件中的一个条目,可以是文件或目录。
ZipInputStream:用于进行zip格式的压缩文件输入流。

ZipOutputStream:用于进行zip格式的压缩文件输出流。

对ZIP格式的文件进行解压

        在解压缩zip格式文件时,首先,根据原始路径(字符串),创建源文件(File对象);其次创建根目录,在创建时如果根目录存在,则删除(借助第三方commons-io包提供的FileUtils工具类进行删除);接着,遍历压缩包中的每个子目录或子文件(zipEntry类型的对象),判断zipEntry是否为空,如果不为空则创建子目录或子文件(File对象);最后,读取当前压缩包中的子文件,并通过输出流out写入新子文件中。

package com.yym.zip.test;

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

import org.apache.commons.io.FileUtils;

public class Test02 {
	public static void main(String[] args) {
		String path ="F:\\Test\\IOzip\\apache-jmeter-5.6.3.zip";
//		String path="F:\\Test\\IOzip\\实验案例.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 sourceFileName = sourceFile.getName();
		File rootDir = new File(sourceFile.getParent()+"\\"+sourceFileName.substring(0,sourceFileName.lastIndexOf(".")));
		if (rootDir.exists()) {
			// 如果存在,则删除
			// rootDir.delete();//仅能删除空目录
			
			// 使用commons-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) {
//				System.out.println(zipEntry.getName());
				// 创建子目录或子文件(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(buff)) != -1) {
							out.write(buff,0,len);
						}
					}
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

运行结果:

对RAR格式的文件进行解压

        在解压缩rar格式文件时需导入第三方junrar-7.5.5.jar和slf4j-api-2.0.13.jar包,首先,根据原始路径(字符串),创建源文件(File对象);其次创建根目录,在创建时如果根目录存在,则删除(借助第三方commons-io包提供的FileUtils工具类进行删除);接着,创建Archive对象,用于读取rar压缩文件格式,获取压缩文件中的所有子目录或子文件(FileHeader对象) 按照子目录(子文件)名称排序;最后,创建新子目录和子文件,获取压缩包中的子文件输入流,复制文件输入流至新子文件。

package com.yym.zip.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
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 Test02 {
	public static void main(String[] args) {
//		String path ="F:\\Test\\IOzip\\apache-jmeter-5.6.3.zip";
		String path="F:\\Test\\IOzip\\实验案例.rar";
		if (path.endsWith(".zip")) {
			unzip(path);
		}else if (path.endsWith(".rar")) {
			unrar(path);
		}
	}
	// 解压缩rar格式
	public static void unrar(String path) {
		// 根据原始路径(字符串),创建源文件(File对象)
		File rarFile = new File(path);
		File rootDir = new File(rarFile.getParent()+"\\"+rarFile.getName().substring(0,rarFile.getName().lastIndexOf(".")));
		if (rootDir.exists()) {
			// 使用commons-io包提供的FileUtils工具类进行删除
			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格式的文件进行压缩

        首先,获取所在目录,获取所有原始子文件;其次,创建zip压缩文件的输出流,遍历所有原始子文件,写入一个压缩包中的子文件(zipEntry对象),写入字节内容;最后,关闭压缩包中的子文件。

package com.yym.zip.test;

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 Test05 {
	public static void main(String[] args) {
		// 所在目录
		File dir = new File("F:\\Test\\IOzip\\id");
		// 获取所有原始子文件
		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();
		}
				
	}
}

运行结果: 

标签:文件,java,IO,zip,压缩文件,io,Java,File,import
From: https://blog.csdn.net/Katharine_Yuan/article/details/140358743

相关文章

  • 人工智能期刊征文【International Journal of Complexity in Applied Science and Tec
    InternationalJournalofComplexityinAppliedScienceandTechnology投稿网址:https://www.inderscience.com/jhome.php?jcode=ijcast在IJCAST上发表的论文不收取任何版面费!!!!IJCAST旨在通过传播新颖的智能方法和技术来解决应用科学和技术中各种新兴的复杂性,这些新方法和......
  • 微信小程序源码-基于Java后端的汽车维修项目管理系统毕业设计(附源码+论文)
    大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。......
  • 微信小程序源码-基于Java后端的网约巴士订票平台系统毕业设计(附源码+论文)
    大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。......
  • Java实现学生管理系统
        学生类packageStudentsSystem;publicclassStudent{privateStringid;privateStringname;privateintage;privateStringaddress;publicStudent(){}publicStudent(Stringid,Stringname,intage,Stringaddress......
  • 基于Java的科大讯飞大模型API调用实现
        写在前面:因为现在自己实习的公司新拓展的一个业务是结合AI的低代码平台,我负责后端的开发,之前一直都是直接使用gpt或者文心一言等ui界面来直接使用大模型,从来没有自己调接口过,所以本文记录一下自己第一次使用大模型的心得,小趴菜一个,大佬们勿喷~~    源码:ll......
  • 如何处理压缩文件de方式总结!!!
    目录1.Java标准库中的压缩相关API2.解压缩过程3.第三方库4.使用第三方库的步骤5.参考代码1.Java标准库中的压缩相关APIJava的标准库java.util.zip提供了处理ZIP和GZIP格式压缩文件的功能。这个包包含以下主要类:(1)ZipFile:用于读取ZIP文件的元数据,如文件列表和注......
  • 深入解析Spring Boot的application.yml配置文件
    目录引言SpringBoot配置文件简介application.yml的优点基本结构与语法YAML语法基础SpringBoot中application.yml的基本结构常见配置项详解服务器配置数据源配置日志配置其他常见配置环境配置与Profile多环境配置激活Profile高级配置与技巧属性的占位符替换自定......
  • java—Spring框架
    Spring简介        Spring框架由RodJohnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率。Spring是什么?      ......
  • Java中线程池的最佳实践
    一、使用正确的声明方式线程池必须手动通过ThreadPoolExecutor的构造函数来声明,避免使用Executors类创建线程池,会有OOM风险。Executors创建的线程池对象有以下弊端:FixedThreadPool和SingleThreadExecutor使用的是有界阻塞队列LinkedBlockingQueue,任务队列的默认长度和......
  • Java多线程&并发编程(二)
    一、CyclicBarrier、CountDownLatch、Semaphore的区别CyclicBarrier的某个线程运行到某个点上之后,该线程即停止运行,直到所有的线程都到达了这个点,所有线程才重新运行(类似于一个栅栏拦住所有线程直到所有线程到达后在重新执行)CountDownLatch则不是,某线程运行到某个点上之后,......