首先需要简单的了解一下API,ZipOutStream中是以ZipEntry为一个文件或者一个目录的。这里只讲使用方法。
import java.util.zip.ZipEntry; import java.util.zip.ZipIntputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import java.io.BufferedInputStream; import java.util.ArrayList; import java.util.List; class ZipUtil{ /**** * 可以传入文件夹和文件 * TODO 这里省去了参数非空验证,文件是否存在的操作 * 复制直接使用请自行加入验证 * filePath 文件夹或文件名 * zipPath 压缩文件绝对路径 * isSrc 是否保持原来的目录结构 public static void fileToZip(String filePath,String zipPath,boolean isSrc){ //1.根据参数来判断入参是文件还是文件夹 File root = new File(filePath); List<File> files = new ArrayList<>(); if (root.isDirectory()){ //遍历文件 files.addAll(allFile(filePath)); }else{ //直接写入 files.add(root); try ( FileOutputStream fileOutputStream = new FileOutputStream(zipPath); ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream) ZipEntry fileEntry = null; for (int i = 0; i < files.size(); i++) { File file = files.get(i); if (isSrc) { fileEntry = new ZipEntry(file.getAbsolutePath()); } else { //会存在重名的问题 //创建ZipEntry中的参数就是压缩包中文件名称 fileEntry = new ZipEntry(i + "_" + file.getName()); zipOutputStream.putNextEntry(fileEntry); int len = -1; FileInputStream inputStream = new FileInputStream(file); BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); byte[] buffer = new byte[8096]; while ((len = bufferedInputStream.read(buffer)) > 0) { zipOutputStream.write(buffer, 0, len); bufferedInputStream.close(); inputStream.close(); zipOutputStream.closeEntry(); } catch (IOException e) { e.printStackTrace(); //获取目录下的所有文件 private static List<File> allFile(String filePath) { List<File> files = new ArrayList<>(); File root = new File(filePath); if (root.exists()) { if (root.isDirectory()) { File[] listFiles = root.listFiles(); for (File file : listFiles) { if (file.isDirectory()) { files.addAll(allFile(file.getAbsolutePath())); } else { files.add(file); } else { files.add(root); return files; 详细操作以及代码注释都已经写在源码中,请自行看注释。 2.ZipInputStream /**** * @param filePath 需要解压的文件 * @param unZipPath 解压完放置文件的位置 public void unZipToFile(String filePath,String unZipPath){ try ( InputStream inputStream = new FileInputStream(filePath); ZipInputStream zipInputStream = new ZipInputStream(inputStream) ZipEntry zipEntry = null; while ((zipEntry = zipInputStream.getNextEntry()) != null) { File zipFile = new File(unZipPath, zipEntry.getName()); if (zipEntry.isDirectory()) { zipFile.mkdirs(); } else { zipFile.getParentFile().mkdirs(); System.out.println(zipEntry.getName()); FileOutputStream fileOutputStream = new FileOutputStream(zipFile); int len = -1; byte[] bytes = new byte[8096]; while ((len = zipInputStream.read(bytes)) > 0) { fileOutputStream.write(bytes, 0, len); fileOutputStream.close(); zipInputStream.closeEntry(); } catch (IOException e) { e.printStackTrace(); ZipInputStream实现压缩文件的读取与数据转化对象的过程 因为项目业务需要,实现调用第三方接口获取zip文件(byte数组形式接收),并解析文件的数据内容,将数据转化为自定义的对象保存于数据库中。整个过程不需要将文件存于磁盘。 以下为笔者所实现功能的代码,首次分享,大牛勿喷,多多指教~ public void resolveZipFile() { //自定义对象接收数... import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.zip.ZipEntry 最近在改bug的时候遇到了一个与zipoutputStream相关的代码,虽然最终不是这处代码的问题,但是自己还是想总结一下zipoutputStream的使用 二 zipoutputStream 类图 三 zipoutputStream使用 zipoutputStream是fileOutputStream中的一种,它可以将内容直接写入到zip包中。一般创建zipoutputStream通常是封装一个FileOutputStream,然后在每写入一个文件之前,需要先调用一次... 我们在有些时候,使用网站下载的文件,会是以流的方式接收,而还有些时候,原文件格式为压缩包文件,这时,我们再使用InputStream/OutputStream或者FileInutStram/FileOutputStream来接收或者解析的话,就无法打开下载后的压缩文件,那么,下载的压缩文件流(压缩包流)怎么能打开呢? 答案很简单:使用ZipInputStream/FileOutputStream方式来接 首先,我们将获取到的InputStream流转换成ZipInputStream 然后,用zipInput ZipOutputStream压缩流 此流用于以 ZIP 文件格式写入文件,包括对压缩和未压缩条目的支持,也就是把文件打包成压缩文件,常用于附件下载(多文件下载),文件压缩存储。 常用的两个方法: public void putNextEntry(ZipEntry e); 开始写入新的 ZIP 文件条目并将流定位到条目数据的开头。如果仍处于活动状态,则关闭当前条目。 这里的ZipEntry就是一个条目 public void closeEntry(); 关闭当前 ZIP 条目并定位流以写入下 《Java开发实战经典》第12章Java IO,Java IO操作主要指的是使用Java进行输入、输出操作,Java中的所有操作类都存放在java.io包中,在使用时需要导入此包。本节为大家介绍ZipInputStream类。 <script src="http://www.51cto.com/js/article/keywords_ad_new.js"></sc... 最近公司需要打包下载各种doc文档。这里还有一个坑,由于系统有Windows的桌面版,用表单数据提交后,使用response.outputstream()输出数据流,桌面端没法接收并下载。这里有个人保持疑问,不知道他们桌面端是否真的不能解决。所以我就先把form表单数据缓存到Redis,然后返回一个get方式请求的接口给对方。这样就能解决下载问题。具体代码: public Object expor... 1 package test.io; 2 import java.io.ByteArrayInputStream; 3 import java.io.ByteArrayOutputStream; 4 import zip流的读操作 ZipInputStream是一种FilterInputStream,它可以直接读取zip包的内容。 ZipInputStream的使用:首先创建一个ZipInputStream,通常是传入一个FileInputStream作为数据源,然后,循坏调用getNextEntry(),知道返回null,表示Zip流的结束。 ZipEntry实际上表示的就是一个压缩文件或者目录,如果是压缩文件,就用read()方法不断读取,知道返回-1。 代码实现: try (ZipInputStream zip 流对象说白了就是一堆进制码,并不支持和文件的直接转换,因为流本身并不知道文件的类型 实现思路: 先使用File创建出一个对应的文件,指定好类型,把流对象输入文件中,判断为-1则表示输入完成 @Test public void test01() throws Exception{ InputStream Input = //获取 ZipInputStream 是 Java 中用于读取 ZIP 文件的输入流。它可以将 ZIP 文件中的每个条目作为单独的输入流进行读取,以便您可以逐个处理它们。 使用 ZipInputStream,您可以逐个读取 ZIP 文件中的每个条目,并在必要时对其进行处理。例如,您可以使用它来解压缩 ZIP 文件,将其内容写入磁盘上的文件,或者直接将 ZIP 文件的内容发送到网络上的另一台计算机。 以下是使用 ZipInputStream 读取 ZIP 文件的示例代码: ```java try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream("example.zip"))) { ZipEntry entry = zipIn.getNextEntry(); while (entry != null) { // 处理 ZIP 文件中的当前条目 // ... // 读取下一个 ZIP 条目 entry = zipIn.getNextEntry(); } catch (IOException e) { // 处理异常 在这个例子中,我们首先创建了一个 ZipInputStream 对象,并将其包装在一个 try-with-resources 块中,以确保在使用完毕后正确关闭它。然后,在 while 循环中,我们使用 getNextEntry() 方法逐个读取 ZIP 文件中的每个条目,并对其进行处理。最后,我们在循环结尾处读取下一个 ZIP 条目,并在没有更多条目可供读取时退出循环。
import java.util.zip.ZipEntry; import java.util.zip.ZipIntputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import java.io.BufferedInputStream; import java.util.ArrayList; import java.util.List; class ZipUtil{ /**** * 可以传入文件夹和文件 * TODO 这里省去了参数非空验证,文件是否存在的操作 * 复制直接使用请自行加入验证 * filePath 文件夹或文件名 * zipPath 压缩文件绝对路径 * isSrc 是否保持原来的目录结构 public static void fileToZip(String filePath,String zipPath,boolean isSrc){ //1.根据参数来判断入参是文件还是文件夹 File root = new File(filePath); List<File> files = new ArrayList<>(); if (root.isDirectory()){ //遍历文件 files.addAll(allFile(filePath)); }else{ //直接写入 files.add(root); try ( FileOutputStream fileOutputStream = new FileOutputStream(zipPath); ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream) ZipEntry fileEntry = null; for (int i = 0; i < files.size(); i++) { File file = files.get(i); if (isSrc) { fileEntry = new ZipEntry(file.getAbsolutePath()); } else { //会存在重名的问题 //创建ZipEntry中的参数就是压缩包中文件名称 fileEntry = new ZipEntry(i + "_" + file.getName()); zipOutputStream.putNextEntry(fileEntry); int len = -1; FileInputStream inputStream = new FileInputStream(file); BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); byte[] buffer = new byte[8096]; while ((len = bufferedInputStream.read(buffer)) > 0) { zipOutputStream.write(buffer, 0, len); bufferedInputStream.close(); inputStream.close(); zipOutputStream.closeEntry(); } catch (IOException e) { e.printStackTrace(); //获取目录下的所有文件 private static List<File> allFile(String filePath) { List<File> files = new ArrayList<>(); File root = new File(filePath); if (root.exists()) { if (root.isDirectory()) { File[] listFiles = root.listFiles(); for (File file : listFiles) { if (file.isDirectory()) { files.addAll(allFile(file.getAbsolutePath())); } else { files.add(file); } else { files.add(root); return files; 详细操作以及代码注释都已经写在源码中,请自行看注释。
详细操作以及代码注释都已经写在源码中,请自行看注释。
2.ZipInputStream /**** * @param filePath 需要解压的文件 * @param unZipPath 解压完放置文件的位置 public void unZipToFile(String filePath,String unZipPath){ try ( InputStream inputStream = new FileInputStream(filePath); ZipInputStream zipInputStream = new ZipInputStream(inputStream) ZipEntry zipEntry = null; while ((zipEntry = zipInputStream.getNextEntry()) != null) { File zipFile = new File(unZipPath, zipEntry.getName()); if (zipEntry.isDirectory()) { zipFile.mkdirs(); } else { zipFile.getParentFile().mkdirs(); System.out.println(zipEntry.getName()); FileOutputStream fileOutputStream = new FileOutputStream(zipFile); int len = -1; byte[] bytes = new byte[8096]; while ((len = zipInputStream.read(bytes)) > 0) { fileOutputStream.write(bytes, 0, len); fileOutputStream.close(); zipInputStream.closeEntry(); } catch (IOException e) { e.printStackTrace(); ZipInputStream实现压缩文件的读取与数据转化对象的过程 因为项目业务需要,实现调用第三方接口获取zip文件(byte数组形式接收),并解析文件的数据内容,将数据转化为自定义的对象保存于数据库中。整个过程不需要将文件存于磁盘。 以下为笔者所实现功能的代码,首次分享,大牛勿喷,多多指教~ public void resolveZipFile() { //自定义对象接收数... import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.zip.ZipEntry 最近在改bug的时候遇到了一个与zipoutputStream相关的代码,虽然最终不是这处代码的问题,但是自己还是想总结一下zipoutputStream的使用 二 zipoutputStream 类图 三 zipoutputStream使用 zipoutputStream是fileOutputStream中的一种,它可以将内容直接写入到zip包中。一般创建zipoutputStream通常是封装一个FileOutputStream,然后在每写入一个文件之前,需要先调用一次... 我们在有些时候,使用网站下载的文件,会是以流的方式接收,而还有些时候,原文件格式为压缩包文件,这时,我们再使用InputStream/OutputStream或者FileInutStram/FileOutputStream来接收或者解析的话,就无法打开下载后的压缩文件,那么,下载的压缩文件流(压缩包流)怎么能打开呢? 答案很简单:使用ZipInputStream/FileOutputStream方式来接 首先,我们将获取到的InputStream流转换成ZipInputStream 然后,用zipInput ZipOutputStream压缩流 此流用于以 ZIP 文件格式写入文件,包括对压缩和未压缩条目的支持,也就是把文件打包成压缩文件,常用于附件下载(多文件下载),文件压缩存储。 常用的两个方法: public void putNextEntry(ZipEntry e); 开始写入新的 ZIP 文件条目并将流定位到条目数据的开头。如果仍处于活动状态,则关闭当前条目。 这里的ZipEntry就是一个条目 public void closeEntry(); 关闭当前 ZIP 条目并定位流以写入下 《Java开发实战经典》第12章Java IO,Java IO操作主要指的是使用Java进行输入、输出操作,Java中的所有操作类都存放在java.io包中,在使用时需要导入此包。本节为大家介绍ZipInputStream类。 <script src="http://www.51cto.com/js/article/keywords_ad_new.js"></sc... 最近公司需要打包下载各种doc文档。这里还有一个坑,由于系统有Windows的桌面版,用表单数据提交后,使用response.outputstream()输出数据流,桌面端没法接收并下载。这里有个人保持疑问,不知道他们桌面端是否真的不能解决。所以我就先把form表单数据缓存到Redis,然后返回一个get方式请求的接口给对方。这样就能解决下载问题。具体代码: public Object expor... 1 package test.io; 2 import java.io.ByteArrayInputStream; 3 import java.io.ByteArrayOutputStream; 4 import zip流的读操作 ZipInputStream是一种FilterInputStream,它可以直接读取zip包的内容。 ZipInputStream的使用:首先创建一个ZipInputStream,通常是传入一个FileInputStream作为数据源,然后,循坏调用getNextEntry(),知道返回null,表示Zip流的结束。 ZipEntry实际上表示的就是一个压缩文件或者目录,如果是压缩文件,就用read()方法不断读取,知道返回-1。 代码实现: try (ZipInputStream zip 流对象说白了就是一堆进制码,并不支持和文件的直接转换,因为流本身并不知道文件的类型 实现思路: 先使用File创建出一个对应的文件,指定好类型,把流对象输入文件中,判断为-1则表示输入完成 @Test public void test01() throws Exception{ InputStream Input = //获取 ZipInputStream 是 Java 中用于读取 ZIP 文件的输入流。它可以将 ZIP 文件中的每个条目作为单独的输入流进行读取,以便您可以逐个处理它们。 使用 ZipInputStream,您可以逐个读取 ZIP 文件中的每个条目,并在必要时对其进行处理。例如,您可以使用它来解压缩 ZIP 文件,将其内容写入磁盘上的文件,或者直接将 ZIP 文件的内容发送到网络上的另一台计算机。 以下是使用 ZipInputStream 读取 ZIP 文件的示例代码: ```java try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream("example.zip"))) { ZipEntry entry = zipIn.getNextEntry(); while (entry != null) { // 处理 ZIP 文件中的当前条目 // ... // 读取下一个 ZIP 条目 entry = zipIn.getNextEntry(); } catch (IOException e) { // 处理异常 在这个例子中,我们首先创建了一个 ZipInputStream 对象,并将其包装在一个 try-with-resources 块中,以确保在使用完毕后正确关闭它。然后,在 while 循环中,我们使用 getNextEntry() 方法逐个读取 ZIP 文件中的每个条目,并对其进行处理。最后,我们在循环结尾处读取下一个 ZIP 条目,并在没有更多条目可供读取时退出循环。
/**** * @param filePath 需要解压的文件 * @param unZipPath 解压完放置文件的位置 public void unZipToFile(String filePath,String unZipPath){ try ( InputStream inputStream = new FileInputStream(filePath); ZipInputStream zipInputStream = new ZipInputStream(inputStream) ZipEntry zipEntry = null; while ((zipEntry = zipInputStream.getNextEntry()) != null) { File zipFile = new File(unZipPath, zipEntry.getName()); if (zipEntry.isDirectory()) { zipFile.mkdirs(); } else { zipFile.getParentFile().mkdirs(); System.out.println(zipEntry.getName()); FileOutputStream fileOutputStream = new FileOutputStream(zipFile); int len = -1; byte[] bytes = new byte[8096]; while ((len = zipInputStream.read(bytes)) > 0) { fileOutputStream.write(bytes, 0, len); fileOutputStream.close(); zipInputStream.closeEntry(); } catch (IOException e) { e.printStackTrace(); ZipInputStream实现压缩文件的读取与数据转化对象的过程 因为项目业务需要,实现调用第三方接口获取zip文件(byte数组形式接收),并解析文件的数据内容,将数据转化为自定义的对象保存于数据库中。整个过程不需要将文件存于磁盘。 以下为笔者所实现功能的代码,首次分享,大牛勿喷,多多指教~ public void resolveZipFile() { //自定义对象接收数... import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.zip.ZipEntry 最近在改bug的时候遇到了一个与zipoutputStream相关的代码,虽然最终不是这处代码的问题,但是自己还是想总结一下zipoutputStream的使用 二 zipoutputStream 类图 三 zipoutputStream使用 zipoutputStream是fileOutputStream中的一种,它可以将内容直接写入到zip包中。一般创建zipoutputStream通常是封装一个FileOutputStream,然后在每写入一个文件之前,需要先调用一次... 我们在有些时候,使用网站下载的文件,会是以流的方式接收,而还有些时候,原文件格式为压缩包文件,这时,我们再使用InputStream/OutputStream或者FileInutStram/FileOutputStream来接收或者解析的话,就无法打开下载后的压缩文件,那么,下载的压缩文件流(压缩包流)怎么能打开呢? 答案很简单:使用ZipInputStream/FileOutputStream方式来接 首先,我们将获取到的InputStream流转换成ZipInputStream 然后,用zipInput ZipOutputStream压缩流 此流用于以 ZIP 文件格式写入文件,包括对压缩和未压缩条目的支持,也就是把文件打包成压缩文件,常用于附件下载(多文件下载),文件压缩存储。 常用的两个方法: public void putNextEntry(ZipEntry e); 开始写入新的 ZIP 文件条目并将流定位到条目数据的开头。如果仍处于活动状态,则关闭当前条目。 这里的ZipEntry就是一个条目 public void closeEntry(); 关闭当前 ZIP 条目并定位流以写入下 《Java开发实战经典》第12章Java IO,Java IO操作主要指的是使用Java进行输入、输出操作,Java中的所有操作类都存放在java.io包中,在使用时需要导入此包。本节为大家介绍ZipInputStream类。 <script src="http://www.51cto.com/js/article/keywords_ad_new.js"></sc... 最近公司需要打包下载各种doc文档。这里还有一个坑,由于系统有Windows的桌面版,用表单数据提交后,使用response.outputstream()输出数据流,桌面端没法接收并下载。这里有个人保持疑问,不知道他们桌面端是否真的不能解决。所以我就先把form表单数据缓存到Redis,然后返回一个get方式请求的接口给对方。这样就能解决下载问题。具体代码: public Object expor... 1 package test.io; 2 import java.io.ByteArrayInputStream; 3 import java.io.ByteArrayOutputStream; 4 import zip流的读操作 ZipInputStream是一种FilterInputStream,它可以直接读取zip包的内容。 ZipInputStream的使用:首先创建一个ZipInputStream,通常是传入一个FileInputStream作为数据源,然后,循坏调用getNextEntry(),知道返回null,表示Zip流的结束。 ZipEntry实际上表示的就是一个压缩文件或者目录,如果是压缩文件,就用read()方法不断读取,知道返回-1。 代码实现: try (ZipInputStream zip 流对象说白了就是一堆进制码,并不支持和文件的直接转换,因为流本身并不知道文件的类型 实现思路: 先使用File创建出一个对应的文件,指定好类型,把流对象输入文件中,判断为-1则表示输入完成 @Test public void test01() throws Exception{ InputStream Input = //获取 ZipInputStream 是 Java 中用于读取 ZIP 文件的输入流。它可以将 ZIP 文件中的每个条目作为单独的输入流进行读取,以便您可以逐个处理它们。 使用 ZipInputStream,您可以逐个读取 ZIP 文件中的每个条目,并在必要时对其进行处理。例如,您可以使用它来解压缩 ZIP 文件,将其内容写入磁盘上的文件,或者直接将 ZIP 文件的内容发送到网络上的另一台计算机。 以下是使用 ZipInputStream 读取 ZIP 文件的示例代码: ```java try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream("example.zip"))) { ZipEntry entry = zipIn.getNextEntry(); while (entry != null) { // 处理 ZIP 文件中的当前条目 // ... // 读取下一个 ZIP 条目 entry = zipIn.getNextEntry(); } catch (IOException e) { // 处理异常 在这个例子中,我们首先创建了一个 ZipInputStream 对象,并将其包装在一个 try-with-resources 块中,以确保在使用完毕后正确关闭它。然后,在 while 循环中,我们使用 getNextEntry() 方法逐个读取 ZIP 文件中的每个条目,并对其进行处理。最后,我们在循环结尾处读取下一个 ZIP 条目,并在没有更多条目可供读取时退出循环。