Not in GZIP format异常
背景
开发中解压缩和压缩文件的处理是很常遇到的情况。这几天做一个对账的功能的时候,遇到过一个解压gzip压缩文件,报错:Not in GZIP format 的异常问题。组内咨询了其他同事,网上找遍了各种解决方案,
最后因为对方上传压缩文件的时候,把原始zip格式改为gzip格式了。导致怎么解压都是没法解决,把问题解决过程重新梳理一遍,也供同样遇到此类问题的你们一个参考。
过程
简单把我们自己解压方认为是A,FTP服务器称为是B,对方上传文件方称为C。C从第三方平台下载的原始压缩文件格式为:ZIP格式,C上传到FTP服务器B上时的格式为GZIP。压缩文件中的附件表格格式为csv,可以用Excel打开,也可以用文本打开。
我方去FTP上下载下来后,解压缩文件的时候,一直报错如下:
字面意思理解非常简单:不是GZIP格式的文件,但是由于太过相信和依赖C方,一直在寻找本身程序的问题,尝试了网上各种解压GZIP文件的方法,都是于事无补。
解决
让对方C把压缩文件还原成原始格式ZIP文件后,解压正常。问题得到解决。
顺便贴一下解压代码
1、解压缩文件
ZipFile zip = new ZipFile(new File(fileName), Charset.forName("GBK"));//解决中文文件夹乱码
InputStream zipInputStream = null;
for (Enumeration<? extends ZipEntry> entries = zip.entries(); entries.hasMoreElements();){
ZipEntry entry = entries.nextElement();
String zipEntryName = entry.getName();
if(StringUtils.isNotEmpty(zipEntryName) && !zipEntryName.contains("汇总")){
zipInputStream = zip.getInputStream(entry);
}
}
ZipFile zip = new ZipFile(new File(fileName), Charset.forName("GBK")); 有效解决中文乱码问题,以原始文件的编码为准。这里是 GBK
ZipEntry entry = entries.nextElement(); 为得到下解压文件中的下一个附件文件流,通常附件格式:xls、xlsx、csv、txt等。
String zipEntryName = entry.getName(); 当压缩文件中,含有多个附件文件的时候,需要得到某个具体文件名的文件。
2、解析附件
BufferedReader reader = new BufferedReader(new InputStreamReader(zipIn,"GBK"), inputStreamCache);
CSVReader csvReader = new CSVReader(reader, ',');
String[] record = null;
if((record = csvReader.readNext()) != null ){
System.out.println(record[0]);
System.out.println(record[1]);
System.out.println(record[2]);
System.out.println(record[3]);
...
}
BufferedReader 读取文件流,这里的 new InputStreamReader(zipIn,"GBK") 编码格式保持跟前面一致,才不会乱码。
CSVReader csvReader = new CSVReader(reader, ','); 以csv格式解析文件并读取数据。
最后循环遍历附件表格的数据,String[] record 代表表格中数据的行记录数组,每一行又以表格的列数读取具体数据值:record[0]、record[1]、record[2]…
业务逻辑自己封装处理即可。
还没有评论,来说两句吧...