Java将指定文件/文件夹压缩成zip、rar压缩文件--解決中文乱码

简介: Java将指定文件/文件夹压缩成zip、rar压缩文件--解決中文乱码

参考:https://blog.csdn.net/itzgs/article/details/31776259

一、压缩工具类

package com.xxxx.utils;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
 
import java.io.*;
import java.util.zip.CheckedOutputStream;
import java.util.zip.CRC32;
 
/**
 *
 * 将指定文件/文件夹压缩成zip、rar压缩文件
 */
public class ZipCompressor {
 
    /**
     * 默认构造函数
     */
    public ZipCompressor() {
 
    }
 
    /**
     * @param resourcesPath 资源文件夹
     * @param targetPath 目的压缩文件保存路径
     * @param targetName 压缩包文件名称
     * @return void
     * @throws Exception
     * @desc 将源文件/文件夹生成指定格式的压缩文件,格式zip
     */
    public void compressedFile(String resourcesPath, String targetPath,String targetName) throws Exception {
        File resourcesFile = new File(resourcesPath);   
        File targetFile = new File(targetPath); 
  
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }
 
        FileOutputStream outputStream = new FileOutputStream(targetPath + "/" + targetName+".zip");
        CheckedOutputStream cos = new CheckedOutputStream(outputStream, new CRC32());
        ZipOutputStream out = new org.apache.tools.zip.ZipOutputStream(cos);
        createCompressedFile(out, resourcesFile, "");
        out.close();
 
    }
 
    /**
     * @param out  输出流
     * @param file 目标文件
     * @return void
     * @throws Exception
     * @desc 生成压缩文件。
     * 如果是文件夹,则使用递归,进行文件遍历、压缩
     * 如果是文件,直接压缩
     */
    public void createCompressedFile(ZipOutputStream out, File file, String dir) throws Exception {
        //如果当前的是文件夹,则进行进一步处理
        if (file.isDirectory()) {
            //得到文件列表信息
            File[] files = file.listFiles();
            //将文件夹添加到下一级打包目录
            out.putNextEntry(new ZipEntry(dir + "/"));
 
            dir = dir.length() == 0 ? "" : dir + "/";
 
            //循环将文件夹中的文件打包
            for (int i = 0; i < files.length; i++) {
                createCompressedFile(out, files[i], dir + files[i].getName());
            }
        } else {   //当前的是文件,打包处理
            //文件输入流
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
            ZipEntry entry = new ZipEntry(dir);
            out.setEncoding("GBK");
            out.putNextEntry(entry);
            // out.putNextEntry(new ZipEntry(dir));
            //进行写操作
            int j = 0;
            byte[] buffer = new byte[1024];
            while ((j = bis.read(buffer)) > 0) {
                out.write(buffer, 0, j);
            }
            //关闭输入流
            bis.close();
        }
    }
}

二、测试代码

 @Test
    void ziptest(){
        String sourceFilePath = "D:\\file\\photo\\2021\\01\\30";
        ZipCompressor  zipCompressor = new ZipCompressor();
        try {
           
            zipCompressor.compressedFile(sourceFilePath, "F:\\test\\zip","464646");
            System.out.println("压缩文件已经生成...");
        } catch (Exception e) {
            System.out.println("压缩文件生成失败...");
            e.printStackTrace();
        }
    }

目录
相关文章
|
1天前
|
IDE Java 编译器
使用Java分割PDF文件
使用Java分割PDF文件
8 1
|
2天前
|
存储 监控 Java
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
|
2天前
|
XML Java 定位技术
详尽分享经纬坐标(BLH)数据创建.kml文件小工具设计Java版
详尽分享经纬坐标(BLH)数据创建.kml文件小工具设计Java版
|
2天前
|
Java API 开发者
如何在Java中实现高效的文件读写
如何在Java中实现高效的文件读写
|
3天前
|
Java 机器人 程序员
Java中的文件I/O操作:流、读写和NIO详解
Java中的文件I/O操作:流、读写和NIO详解
|
3天前
|
Java 机器人 程序员
Java中的线程通信:wait、notify与Condition详解
Java中的线程通信:wait、notify与Condition详解
|
3天前
|
存储 安全 Java
Java中的线程安全与同步技术
Java中的线程安全与同步技术
|
1天前
|
监控 Java 调度
Java并发编程:深入理解线程池
【6月更文挑战第26天】在Java并发编程的世界中,线程池是提升应用性能、优化资源管理的关键组件。本文将深入探讨线程池的内部机制,从核心概念到实际应用,揭示如何有效利用线程池来处理并发任务,同时避免常见的陷阱和错误实践。通过实例分析,我们将了解线程池配置的策略和对性能的影响,以及如何监控和维护线程池的健康状况。
7 1
|
1天前
|
存储 缓存 Java
老程序员分享:Java并发编程:线程池的使用
老程序员分享:Java并发编程:线程池的使用
|
1天前
|
Java 数据库连接 调度
Java多线程,对锁机制的进一步分析
Java多线程,对锁机制的进一步分析