压缩文件——干货代码分享

news2025/1/13 13:31:33

1.背景

        最近写接口遇到通过FTP服务器发送文件的需求,文件内容需加密并压缩,故记录一下,提供已经测试通过的代码。

2.代码

        

package com.example.demo.utils;

import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.util.zip.GZIPOutputStream;

@Slf4j
public class GZipUtils {
    /**
    * compress the file
    * @param inBoundFilePath the file need to compress
    * @return the uncompressed file's absolute path
    * */
    public static String doCompressFile(String inBoundFilePath) {
        String newFileName;
        File zipFile;
        /*auto-closeable*/
        try(FileInputStream inputStream = new FileInputStream(inBoundFilePath);
        GZIPOutputStream gzipOutputStream = new GZIPOutputStream(new FileOutputStream(inBoundFilePath + ".gz"))){
            log.debug("... opening ...filepath{} ",inBoundFilePath);
            log.debug("... compressing ...");
            byte[] bytes = new byte[1024];
            int readLength ;
            int fileLength = 0;
            while(( readLength = inputStream.read(bytes)) > 0) {
                gzipOutputStream.write(bytes,0,fileLength);
                fileLength+=readLength;
            }
            gzipOutputStream.finish();
            gzipOutputStream.flush();
            log.debug("compress task finish");
            log.debug("original file size {}",fileLength);
            zipFile = new File(inBoundFilePath + ".gz");
            log.debug("compressed file size {}",zipFile.length());
        } catch (FileNotFoundException e) {
            log.error("filename:{} doesn't exists",inBoundFilePath);
            log.error(e.getMessage());
            return null;
        } catch (IOException e) {
            log.error(e.getMessage());
            return null;
        }

        /*reName the filename with file size suffix .It's required by the requirements doc */
        String fileLength = String.format("%08d",Integer.parseInt(String.valueOf(zipFile.length())));
        newFileName = inBoundFilePath + fileLength;
        if (reName(inBoundFilePath + ".gz",newFileName)){
            return newFileName;
        } else {
            log.error("error renaming");
            return null;
        }
    }
    /**
     * rename the file
     * @param absolutePathName the filename with absolute path prefix
     * @param newFilename renamed filename
     * @return boolean
     * */
    private static boolean reName(String absolutePathName,String newFilename) {
        File file = new File(absolutePathName);
        if (file.exists()) {
            return file.renameTo(new File(newFilename));
        }
        log.error("file doesn't exists ");
        return false ;
    }
}

测试,一个文档

大小

测试类

 测试结果,控制台显示

核对压缩后文件的实际大小

 解压缩软件打开后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/703622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大学智慧课堂系统整理

目录 一、题目类型选择器(非组件库) 1.1、效果展示 1.2、代码展示 二、题目类型选择器(Vant组件库) 2.1、效果展示 2.2、代码展示 一、题目类型选择器(非组件库) 使用vue2:在methods里区分单个点击和多个点击,在view视图区分判断题和选择题。 如下…

正则表达式和BeautifulSoup

文章目录 1、正则表达式介绍2、正则表达式和BeautifulSoup3、获取属性4、Lambda表达式 1、正则表达式介绍 正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。它描述了一种字符串匹配的模式(pattern),可以用来…

​Nature |HiFi宏基因组助力挖掘海洋“新”微生物组

近期在《Nature》发表的一篇研究论文中,表述了如何在罕见的微生物类群和环境中研究未知的酶和天然产物,研究突出了微生物组学在深入挖掘天然产物合成与酶学机制中的关键作用,对海洋生态、进化、生物技术与天然产物等领域的研究具有重要意义。…

基于Java+Vue前后端分离乐购游戏商城系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

制造企业可以通过数字工厂管理系统降低采购成本吗

制造企业可以通过数字工厂管理系统降低采购成本。制造业数字工厂系统是一种基于数字化技术的管理系统,可以帮助企业实现生产过程的数字化管理,提高生产效率和降低生产成本。下面具体介绍数字工厂管理系统如何降低制造企业的采购成本。 一、优化采购计划 …

【两个无穷大的数相加】

两个无穷大的数相加 两个无穷大的数相加,因为int有限,哪怕用long int也不可能够,用string存,用手工算数的方式从右往左一位一位加,满10就进一。这样不管有多长,都能算出结果。 最近在做QT项目,所以用c写的…

荔枝集团战队斩获 2023 Amazon DeepRacer自动驾驶赛车企业总决赛冠军

6月27日,2023 Amazon DeepRacer自动驾驶赛车企业总决赛在上海决出了最终结果,荔枝集团“状元红”战队与Cisco、德勤管理咨询、北京辛诺创新、神州泰岳、敦煌网等12支队伍的竞逐中,在两轮比赛中成绩遥遥领先,最终斩获桂冠。而今年年…

【LeetCode热题100】打卡第28天:不同的二叉搜索树验证二叉搜索树对称二叉树

文章目录 【LeetCode热题100】打卡第28天:不同的二叉搜索树&验证二叉搜索树&对称二叉树⛅前言 不同的二叉搜索树🔒题目🔑题解 验证二叉搜索树🔒题目🔑题解 对称二叉树🔒题目🔑题解 【Le…

真人手办店值得投资吗?

最近一两年有一种专为普通人设计的真人手办已经开始风靡,很多城市都有了真人手办店的身影,不少人的家里也摆上了属于自己的真人手办,这些手办可以说就是缩小版的我们自己。 除了消费者对这个新生事物有兴趣,许多想要创业的年轻人也…

Prophet算法框架趋势模型、季节模型原理详解与应用实践

本文是在ChatGPT协助下完成,提高了写作速度和效率。 1. 趋势模型 1.1. 趋势模型概述 当我们谈论Prophet中的趋势模型时,我们可以将其理解为描述时间序列数据中整体趋势的一种方式。趋势模型可以告诉我们数据随着时间的推移是如何变化的,是…

Kubernetes Pod篇

Pod基础概念: Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的S…

Linux--通配结构:*

功能: 与字符匹配后,作用时的作用对象是与字符匹配的文件 示例: ①显示以.c结尾的文件 ②显示file开头的文件③强制(f)递归(r)删除以.c结尾的文件 ④删除该目录下的一切文件及目录

联想小新Pro16怎么重装Win10系统?联想小新Pro16重装系统Win10教程

如果您是联想小新Pro16的用户,并且想要重装Win10系统,那么您来对地方了,无论是出于系统崩溃、性能下降还是个人需求改变的原因,重新安装操作系统可以帮助您恢复电脑的正常运行和提升使用体验。以下小编将为您分享联想小新Pro16重装…

Linux内核中常用的C语言技巧详解

概要 Linux内核采用的是GCC编译器,GCC编译器除了支持ANSI C,还支持GNU C。在Linux内核中,许多地方都使用了GNU C语言的扩展特性,如typeof、__attribute__、__aligned、__builtin_等,这些都是GNU C语言的特性。 typeof…

python中,数组 nums[:] 和nums有何区别?

leetcode中有一道题。题目为: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改…

对于超过最大宽度的文字 想要换行怎么解决

对于超过最大宽度的文字,你可以 1、使用CSS中的word-break属性来换行: .rich-text {word-break: break-all; } break-all 属性允许在字符串内的任何地方换行。 2、使用overflow-wrap属性:break-word 也允许在字符串的任何地方换行。 .rich-text {overflow-wrap: break-wo…

Blazor 自定义可重用基础组件之 InputString(InputText)

为避免命名冲突&#xff0c;将InputText改名为InputString&#xff0c;其实内部类型就是string。 <div class"d-flex"><label class"control-label w-auto mt-2"><b>Lable</b></label><div style"width:InputWidth…

数智化时代,国企人力资源创新突破与高质量发展

二十大以来&#xff0c;在全面建设社会主义现代化背景下&#xff0c;以更大的力度、更切实的措施推动国资国企改革&#xff0c;推动世界一流企业由“培育”转入“加快建设”阶段。历经三年行动&#xff0c;国有企业改革已经取得了令人瞩目的成就。 今年以来&#xff0c;国务院国…

JAVA麻将胡牌算法深度解析

目录 麻将的基本概念 麻将牌的构成 麻将的碰&#xff0c;杠&#xff0c;吃&#xff0c;听&#xff0c;胡 麻将胡牌条件 胡牌算法简介 选将拆分法 算法数据结构 构建数据结构 数据结构使用 牌花色的获取 获取某一花色的牌值 获取某一张牌相邻牌 算法代码实现 基础代…

word另存为pdf失败的原因及处理方法

我们知道&#xff0c;Word可以通过另存为方式直接保存为PDF&#xff0c;其原理其实跟打印机打印差不多&#xff0c;PDF就是一台虚拟的打印机&#xff0c;但有些同学反映word另存为pdf失败&#xff0c;可能的原因是什么呢&#xff1f;又该如何处理呢&#xff1f; word另存为pdf…