如何在Java中创建之前估计java中的zip文件大小

2022-09-03 14:41:59

我有一个要求,其中我必须从可用文件列表中创建一个zip文件。这些文件是不同类型的,如txt,pdf,xml等。我正在使用java util类来做到这一点。

此处的要求是保持最大文件大小 5 mb。我应该根据时间戳从列表中选择文件,将文件添加到zip,直到zip文件大小达到5 mb。我应该跳过剩余的文件。

请让我知道,如果有一种方法在java中,我可以在不创建实际文件的情况下提前估计zip文件大小?

或者有没有其他方法来解决这个问题


答案 1

将您的 ZipOutputStream 包装到一个个性化的 OutputStream 中,此处命名为 YourOutputStream。

  • YourOutputStream的构造函数将创建另一个ZipOutputStream(zos2),它包装一个新的ByteArrayOutputStream(baos)
    public YourOutputStream(ZipOutputStream zos, int maxSizeInBytes)
  • 当你想用 写一个文件时,它会先把它写在zos2


    上等等...YourOutputStreampublic void writeFile(File file) throws ZipFileFullExceptionpublic void writeFile(String path) throws ZipFileFullException
  • 如果 baos.size() 低于maxSizeInBytes
    • 将文件写入 zos1
    • close zos1, baos, zos2 a throw a throw a exception.对于例外,我想不出已经存在的一个,如果有,使用它,否则创建自己的IOException ZipFileFullException。

您需要两个ZipOutputStream,一个写在驱动器上,一个用于检查您的内容是否超过5MB。

编辑:事实上我检查过,你不能轻易删除ZipEntry

http://download.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html#size()


答案 2

科林·赫伯特的+1:逐个添加文件,备份上一步或删除最后一个文件(如果存档很大)。我只想添加一些细节:

预测太不可靠了。例如,PDF可以包含未压缩的文本,并压缩到原始文本的30%,或者它包含已经压缩的文本和图像,压缩到80%。您需要检查整个PDF的可压缩性,基本上必须压缩它们。

您可以尝试进行统计预测,但这可以减少失败尝试的次数,但您仍然必须实现上述建议。首先使用更简单的实现,看看它是否足够。

或者,单独压缩文件,然后选择绑定在一起不会超过 5 MB 的文件。如果解压缩也是自动的,则可以将 zip 文件绑定到单个未压缩的 zip 文件中。


推荐