Java IO解压缩文件

zip压缩文件

/* 下列代码通过ZipOutputStream类创建了一个ZIP输出流,并指定输出的ZIP文件路径。
 * 然后,通过递归调用zipFile方法,将源目录中的文件和目录逐个添加到ZIP文件中。
 */
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipExample {
    public static void main(String[] args) {
        String sourceDir = "path/to/source/directory";
        String zipFile = "path/to/output/zipfile.zip";
        
        try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile))) {
            File fileToZip = new File(sourceDir);
            zipFile(fileToZip, fileToZip.getName(), zipOut);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
        if (fileToZip.isHidden()) {
            return;
        }
        
        if (fileToZip.isDirectory()) {
            File[] children = fileToZip.listFiles();
            for (File childFile : children) {
                zipFile(childFile, fileName + "/" + childFile.getName(), zipOut);
            }
        } else {
            byte[] buffer = new byte[1024];
            FileInputStream fis = new FileInputStream(fileToZip);
            zipOut.putNextEntry(new ZipEntry(fileName));
            int length;
            while ((length = fis.read(buffer)) >= 0) {
                zipOut.write(buffer, 0, length);
            }
            fis.close();
        }
    }
}

zip解压缩文件

/* 下列代码通过ZipInputStream类创建了一个ZIP输入流,并指定输入的ZIP文件路径。
 * 然后,通过循环读取ZIP输入流中的条目,并根据条目的类型进行相应的处理,实现了对ZIP文件的解压缩操作。
 */
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UnzipExample {
    public static void main(String[] args) {
        String zipFile = "path/to/zipfile.zip";
        String outputDir = "path/to/output/directory";
        
        try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFile))) {
            ZipEntry entry = zipIn.getNextEntry();
            while (entry != null) {
                String filePath = outputDir + File.separator + entry.getName();
                if (!entry.isDirectory()) {
                    extractFile(zipIn, filePath);
                } else {
                    File dir = new File(filePath);
                    dir.mkdirs();
                }
                zipIn.closeEntry();
                entry = zipIn.getNextEntry();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
        byte[] buffer = new byte[1024];
        FileOutputStream fos = new FileOutputStream(filePath);
        int length;
        while ((length = zipIn.read(buffer)) >= 0) {
            fos.write(buffer, 0, length);
        }
        fos.close();
    }
}
https://www.cnblogs.com/peashooter/p/9455498.html
https://www.cnblogs.com/0616--ataozhijia/p/5022028.html
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

// 定义一个类来关联 OutputStream 和文件名
class OutputStreamWithName {
    OutputStream outputStream;
    String originalFileName;

    public OutputStreamWithName(OutputStream outputStream, String originalFileName) {
        this.outputStream = outputStream;
        this.originalFileName = originalFileName;
    }
}

public class OutputStreamListCompression {
    public static void main(String[] args) {
        // 创建一个 OutputStreamWithName 列表
        List<OutputStreamWithName> outputStreamList = new ArrayList<>();
        ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
        ByteArrayOutputStream baos2 = new ByteArrayOutputStream();

        try {
            // 向 OutputStream 中写入一些示例数据
            baos1.write("Hello, world!".getBytes());
            baos2.write("This is another piece of data.".getBytes());

            // 添加 OutputStream 及其原始文件名
            outputStreamList.add(new OutputStreamWithName(baos1, "original1.txt"));
            outputStreamList.add(new OutputStreamWithName(baos2, "original2.txt"));

            // 创建一个文件输出流,用于写入压缩文件
            FileOutputStream fos = new FileOutputStream("compressed.zip");
            ZipOutputStream zos = new ZipOutputStream(fos);

            // 遍历 OutputStream 列表,将每个流的内容写入压缩文件,并修改文件名
            for (int i = 0; i < outputStreamList.size(); i++) {
                OutputStreamWithName streamWithName = outputStreamList.get(i);
                ByteArrayOutputStream baos = (ByteArrayOutputStream) streamWithName.outputStream;
                byte[] data = baos.toByteArray();
                // 修改文件名,这里简单在原文件名前加 "new_"
                String newFileName = "new_" + streamWithName.originalFileName;
                ZipEntry entry = new ZipEntry(newFileName);
                zos.putNextEntry(entry);
                zos.write(data);
                zos.closeEntry();
            }

            // 关闭压缩输出流和文件输出流
            zos.close();
            fos.close();

            System.out.println("Compression completed successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}  
posted @ 2025-04-22 22:18  (^11^)  阅读(21)  评论(0)    收藏  举报