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

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

测试,一个文档

大小

测试类

 测试结果,控制台显示

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

 解压缩软件打开后

猜你喜欢

转载自blog.csdn.net/Lee_92/article/details/131472090