相关文章推荐
绅士的大象  ·  node.js - nodejs ...·  1 年前    · 
奔跑的鸭蛋  ·  【转载】art ...·  1 年前    · 

1.ZipOutputStream

首先需要简单的了解一下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类。 &lt;script src="http://www.51cto.com/js/article/keywords_ad_new.js"&gt;&lt;/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 = //获取
ZipInputStreamJava 中用于读取 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 条目,并在没有更多条目可供读取时退出循环。