java(ZipOutputStream)将多个文件打成zip

简介: 当想要将两个文件打包成ZIP文件时,可以使用Java的ZipOutputStream类。

ZipOutputStream是Java中用于创建ZIP文件的类,它是java.util.zip包中的一部分。通过使用ZipOutputStream,可以将多个文件压缩到一个ZIP文件中。

以下是ZipOutputStream的一些主要特性和方法:

  1. 创建ZIP文件ZipOutputStream允许创建一个新的ZIP文件,也可以将数据添加到现有的ZIP文件中。
  2. 添加ZIP条目:使用putNextEntry(ZipEntry entry)方法,可以将文件或目录添加为ZIP文件中的一个条目。ZipEntry对象代表一个ZIP条目,可以是文件或目录。
  3. 写入数据:一旦添加了ZIP条目,可以使用write(byte[] b, int off, int len)方法将数据写入ZIP文件。这样,可以从原始文件中读取数据并将其写入到ZIP文件中。
  4. 关闭条目:在写入完ZIP条目的数据后,使用closeEntry()方法来关闭当前的ZIP条目,以便可以添加下一个条目。
  5. 关闭流:在完成ZIP文件的创建后,记得使用close()方法关闭ZipOutputStream,以确保所有的数据都被正确写入ZIP文件。

以下是一个简单的示例代码,演示如何使用ZipOutputStream创建一个ZIP文件并添加两个文件到其中:

1. import java.io.FileInputStream;
2. import java.io.FileOutputStream;
3. import java.io.IOException;
4. import java.util.zip.ZipEntry;
5. import java.util.zip.ZipOutputStream;
6. 
7. public class ZipOutputStreamExample {
8. public static void main(String[] args) {
9. String file1Path = "/path/to/file1.txt";
10. String file2Path = "/path/to/file2.txt";
11. String zipOutputPath = "/path/to/output.zip";
12. 
13. try (FileOutputStream fos = new FileOutputStream(zipOutputPath);
14. ZipOutputStream zipOut = new ZipOutputStream(fos);
15. FileInputStream fis1 = new FileInputStream(file1Path);
16. FileInputStream fis2 = new FileInputStream(file2Path)) {
17. 
18.             addToZipFile(file1Path, fis1, zipOut);
19.             addToZipFile(file2Path, fis2, zipOut);
20. 
21.             System.out.println("文件成功添加到ZIP文件!");
22.         } catch (IOException e) {
23.             e.printStackTrace();
24.         }
25.     }
26. 
27. private static void addToZipFile(String filePath, FileInputStream fis, ZipOutputStream zipOut)
28. throws IOException {
29. ZipEntry zipEntry = new ZipEntry(filePath);
30.         zipOut.putNextEntry(zipEntry);
31. 
32. byte[] bytes = new byte[1024];
33. int length;
34. while ((length = fis.read(bytes)) >= 0) {
35.             zipOut.write(bytes, 0, length);
36.         }
37. 
38.         zipOut.closeEntry();
39.         fis.close();
40.     }
41. }

下面是一个如何将两个文件打包成一个ZIP文件的示例代码:

1. import java.io.FileInputStream;
2. import java.io.FileOutputStream;
3. import java.io.IOException;
4. import java.util.zip.ZipEntry;
5. import java.util.zip.ZipOutputStream;
6. 
7. public class ZipFilesExample {
8. public static void main(String[] args) {
9. // 两个文件的路径
10. String file1Path = "/path/to/file1.txt";
11. String file2Path = "/path/to/file2.txt";
12. 
13. // ZIP文件的输出路径
14. String zipOutputPath = "/path/to/output.zip";
15. 
16. try (FileOutputStream fos = new FileOutputStream(zipOutputPath);
17. ZipOutputStream zipOut = new ZipOutputStream(fos);
18. FileInputStream fis1 = new FileInputStream(file1Path);
19. FileInputStream fis2 = new FileInputStream(file2Path)) {
20. 
21. // 添加第一个文件到ZIP文件
22.             addToZipFile(file1Path, fis1, zipOut);
23. 
24. // 添加第二个文件到ZIP文件
25.             addToZipFile(file2Path, fis2, zipOut);
26. 
27.             System.out.println("文件成功打包成ZIP文件!");
28.         } catch (IOException e) {
29.             e.printStackTrace();
30.         }
31.     }
32. 
33. private static void addToZipFile(String filePath, FileInputStream fis, ZipOutputStream zipOut)
34. throws IOException {
35. // 创建ZIP条目
36. ZipEntry zipEntry = new ZipEntry(new File(filePath).getName());
37. 
38. // 将ZIP条目添加到ZIP文件
39.         zipOut.putNextEntry(zipEntry);
40. 
41. // 从输入流读取数据并写入ZIP文件
42. byte[] bytes = new byte[1024];
43. int length;
44. while ((length = fis.read(bytes)) >= 0) {
45.             zipOut.write(bytes, 0, length);
46.         }
47. 
48. // 关闭当前ZIP条目
49.         zipOut.closeEntry();
50. 
51. // 关闭输入流
52.         fis.close();
53.     }
54. }

在上面的代码中,需要将/path/to/file1.txt/path/to/file2.txt替换为实际的文件路径,并将/path/to/output.zip替换为您希望生成的ZIP文件的路径。

运行此Java程序后,它将读取这两个文件并将它们打包成名为output.zip的ZIP文件,其中包含这两个文件。请确保路径和文件名正确,并且具有写入ZIP文件的权限

目录
相关文章
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
84 9
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
5天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
51 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
26天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
86 34
|
2月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
45 3
|
2月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
2月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
128 2
|
10天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
12天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
12天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。