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 ;
}
}
测试,一个文档
大小
测试类
测试结果,控制台显示
核对压缩后文件的实际大小
解压缩软件打开后