如何在Java中将文件压缩为zip

时间:2019-04-15 03:08:34

标签: java spring-boot apache-poi

我压缩的压缩文件有问题,我已经完成工作。代码有效,但文件未压缩为较小的文件。例如,我的文件 file.csv 2,1MB ,压缩的zip文件大于未压缩的文件,这是我的代码:

byte[] b = out.toByteArray();

            ZipOutputStream zos = new ZipOutputStream(out);
            // String filename = formcode+"_"+period+".xls";
            ZipEntry entry = new ZipEntry("data.xls");
            entry.setSize(b.length);
            zos.putNextEntry(entry);
            zos.write(b);
            zos.closeEntry();
            zos.close();

1 个答案:

答案 0 :(得分:1)

正如评论员已经写过的,当原始文件已被压缩时,压缩文件的大小可以大于原始文件的大小。在您的问题中,您声明自己有file.csv,并且在代码中看到file.xls。您声称使用的是Apache POI,所以我认为您生成了XLS(X)文件。

正如@ pradin-paudel指出的那样,您的问题看起来像重复的一样。

您可以设置压缩方法和压缩级别,但我认为这样做不会带来很多好处。

现在,您似乎正在使用Excel文件,大小/压缩率取决于内容以及文件类型。例如,如果您的XLS文件带有嵌入的2Mb JPEG文件,则大多数文件内容已经被压缩,您将无法获得太多收益。另外,可以尝试使用老人的XLS技巧,即写出一个以逗号分隔的,带有csv扩展名的CSV文本文件,,然后对其进行压缩,Excel可以将其打开(需要将其解压缩)。如果您的内容主要是文本,则压缩文件和典型的XLSX文件之间应该有十倍的差异*。

除非您有数据透视表,否则请在数据中使用函数或其他任何花哨的内容,请使用csv。 Excel 2003和更高版本也具有XML电子表格文件格式,该格式所需的空间是csv文本文件的4倍*,压缩后的大小约为ZIP文件的6倍*。

所以,要回答你的问题:

  1. 检查您的文件或其内容是否尚未压缩。您可以使用记事本打开data.xls,会看到一些垃圾,但是如果前两个字符是PK,则很有可能是压缩数据,在这种情况下,应将文件重命名为xlsx。 / li>
  2. 检查您是否真的需要XLS(X),当您担心文件大小时,对于纯电子表格数据来说这是一个非常糟糕的选择。
  3. 您可以尝试使用压缩级别,但是我怀疑在这种情况下它会增加很多,源文件太小而无法发挥很大作用。