如何在压缩之前获得压缩文件的确切大小?

时间:2014-04-18 05:18:23

标签: java zip

我使用以下独立类来在压缩之前计算压缩文件的大小。 我正在使用0级压缩,但我仍然得到几个字节的差异。 你可以帮我解决这个问题吗?

快速帮助将不胜感激。

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.CRC32;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import org.apache.commons.io.FilenameUtils;


public class zipcode {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub



         try {
             CRC32 crc = new CRC32();

                byte[] b = new byte[1024]; 
                File file = new File("/Users/Lab/Desktop/ABC.xlsx");
            FileInputStream in = new FileInputStream(file);
            crc.reset();
                // out put file 
                ZipOutputStream out = new ZipOutputStream(new FileOutputStream("/Users/Lab/Desktop/ABC.zip"));


                // name the file inside the zip  file 

                ZipEntry entry = new ZipEntry("ABC.xlsx");
                entry.setMethod(ZipEntry.DEFLATED);
                entry.setCompressedSize(file.length());
                entry.setSize(file.length());
                entry.setCrc(crc.getValue());
                out.setMethod(ZipOutputStream.DEFLATED);
                out.setLevel(0);
                //entry.setCompressedSize(in.available());
                //entry.setSize(in.available());
                //entry.setCrc(crc.getValue());


                out.putNextEntry(entry); 
                // buffer size

                int count;

                while ((count = in.read(b)) > 0) {
                    System.out.println();
                    out.write(b, 0, count);
                }
                out.close();
                in.close();         
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

}

1 个答案:

答案 0 :(得分:1)

首先,我不相信解释为什么你需要这样做。如果在开始上传之前需要知道文件大小,则系统设计或实现有问题。

话虽如此,解决方案基本上是在开始上传之前创建ZIP文件:

  • 将ZIP文件写入临时文件并从中上传。

  • 将ZIP文件写入内存中的缓冲区并从中上传。

  • 如果您没有文件空间或内存空间,那么:

    • 创建"沉没" outputStream,它只计算写入的字节数,以计算标称文件大小。

    • 创建/写入ZIP文件到接收器,并捕获文件大小。

    • 打开您的连接以进行上传。

    • 发送包含文件大小的元数据。

    • 第二次创建/写入ZIP,写入套接字流......或其他任何内容。

这3种方法都允许您创建和发送压缩ZIP,如果这将有所帮助。


如果您坚持尝试一次性动态执行此操作,那么您将需要在法医详细信息中阅读ZIP文件规范...并执行一些混乱的算法。帮助你可能超出了SO问题的范围。