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

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 ;
    }
}

测试,一个文档

大小

测试类

 测试结果,控制台显示

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

 解压缩软件打开后

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leon_coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值