Java中zip的压缩和解压缩的实现代码

 更新时间:2021年02月25日 08:37:41   作者:布禾  
这篇文章主要介绍了Java中zip的压缩和解压缩的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

在Java中可以使用ZipOutputStream和ZipInputStream来实现zip的压缩和解压缩操作,另外使用FileSystem也可以用来实现zip的解压缩,下面将介绍这几种方式,直接上代码。

zip压缩

待压缩文件目录结构:

每个zip文件项都要对应一个ZipEntry,然后通过ZipOutputStream的putNextEntry方法开始写入一个新的zip文件项,将文件数据发送到zip输出流中,完成后再调用closeEntry方法。

@Test
public void testCompressByZip() {
	try (
		//指定压缩完成后zip文件的存储路径
		ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream("F:\\myFavorites.zip"))
	)
	{
		//待压缩文件/目录所在的目录
		File fileFolder = new File("F:\\我的收藏");
		//获取目录下的所有文件
		File[] files = fileFolder.listFiles();

		ZipEntry zipEntry;
		byte[] byteArray;
		int len;
		//遍历目录下的所有文件/目录,并将它们添加到压缩文件中
		for (File file : files) {
			//一个ZipEntry对应压缩文件中的一项
			zipEntry = new ZipEntry(file.getName());
			zipOutputStream.putNextEntry(zipEntry);
			try (FileInputStream in = new FileInputStream(file)) {
				byteArray = new byte[1024];
				while ((len = in.read(byteArray)) != -1) {
					zipOutputStream.write(byteArray, 0, len);
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
			zipOutputStream.closeEntry();
		}
	} catch (IOException ex) {
		ex.printStackTrace();
	}
}

压缩结果:

zip解压缩

遍历zip文件中的所有项,并获取对应项的输入流,然后通过FileOutputStream输出到指定目录中。

@Test
public void testDecompressByZip() {
	try (
		//指定需要解压缩的zip文件
		ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream("F:\\myFavorites.zip"))
	)
	{
		ZipEntry zipEntry;
		byte[] byteArray;
		int len;
		//遍历zip文件中的所有项,并逐个解压到指定的目录中
		while ((zipEntry = zipInputStream.getNextEntry()) != null) {
			try (FileOutputStream fileOutputStream = new FileOutputStream("F:\\我的解压目录\\" + zipEntry.getName())) {
				byteArray = new byte[1024];
				while ((len = zipInputStream.read(byteArray)) != -1) {
					fileOutputStream.write(byteArray, 0, len);
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
	} catch (IOException ex) {
		ex.printStackTrace();
	}
}

解压缩结果:

使用FileSystem解压缩

  • 建立一个文件系统,包含zip文件中的所有项。
  • 遍历zip文件中的所有项,通过文件访问器SimpleFileVisitor将每个项复制到指定目录中。
@Test
public void testDecompressByZip2(){
	try {
		//将压缩文件作为一个文件系统访问
		FileSystem fileSystem = FileSystems.newFileSystem(Paths.get("F:\\myFavorites.zip"), null);
		//遍历压缩文件中的内容,并使用文件访问器访问所有内容
		Files.walkFileTree(fileSystem.getPath("/"), new SimpleFileVisitor<Path>() {
			@Override
			public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
				System.out.println("访问目录中文件时调用");
				//将文件解压到指定目录
				Files.copy(file, new FileOutputStream("F:\\我的解压目录\\" + file.getName(file.getNameCount() - 1)));
				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
				System.out.println("访问目录中文件之前调用");
				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
				System.out.println("访问目录中文件失败时调用");
				return FileVisitResult.SKIP_SUBTREE;
			}

			@Override
			public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
				System.out.println("访问目录中的文件及其所有后代之后调用");
				return FileVisitResult.CONTINUE;
			}
		});
	} catch (IOException ex) {
		ex.printStackTrace();
	}
}

到此这篇关于Java中zip的压缩和解压缩的实现代码的文章就介绍到这了,更多相关java zip压缩和解压缩内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot自定义注解使用读写分离Mysql数据库的实例教程

    SpringBoot自定义注解使用读写分离Mysql数据库的实例教程

    这篇文章主要给大家介绍了关于SpringBoot自定义注解使用读写分离Mysql数据库的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Java日期时间使用方法汇总

    Java日期时间使用方法汇总

    这篇文章主要针对Java日期时间使用方法进行汇总,感兴趣的朋友可以参考一下
    2016-03-03
  • 解决mybatisplus插入报错argument type mismatch的问题

    解决mybatisplus插入报错argument type mismatch的问题

    这篇文章主要介绍了解决mybatisplus插入报错argument type mismatch的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • intellij idea创建第一个动态web项目的步骤方法

    intellij idea创建第一个动态web项目的步骤方法

    这篇文章主要介绍了intellij idea创建第一个动态web项目的步骤方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • java文件对话框过滤特定文件类型示例

    java文件对话框过滤特定文件类型示例

    文件作为存储数据的单元,会根据数据类型产生很多分类,也就是所谓的文件类型。在对数据文件进行操作时,常常需要根据不同的文件类型来作不同的处理。本实例实现的是读取文件夹指定类型的文件并显示到表格控件中
    2014-02-02
  • java中的instanceof关键字详细解读

    java中的instanceof关键字详细解读

    这篇文章主要介绍了java中的instanceof关键字详细解读,instanceof 是 Java 的保留关键字,它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型,需要的朋友可以参考下
    2024-01-01
  • Spring @Cacheable注解中key的使用详解

    Spring @Cacheable注解中key的使用详解

    这篇文章主要介绍了Spring @Cacheable注解中key的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring Bean生命周期详细分析

    Spring Bean生命周期详细分析

    spring的核心思想之一IOC就是通过IOC容器对Bean的创建和各个bean之间的依赖关系进行操作,今天就来和大家分享一下bean的生命周期相关知识点
    2022-08-08
  • maven 配置多个仓库的方法

    maven 配置多个仓库的方法

    这篇文章主要介绍了maven 配置多个仓库的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java线程池7个参数的详细含义

    Java线程池7个参数的详细含义

    java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论