我使用以下独立类来在压缩之前计算压缩文件的大小。 我正在使用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();
}
}
}
答案 0 :(得分:1)
首先,我不相信解释为什么你需要这样做。如果在开始上传之前需要知道文件大小,则系统设计或实现有问题。
话虽如此,解决方案基本上是在开始上传之前创建ZIP文件:
将ZIP文件写入临时文件并从中上传。
将ZIP文件写入内存中的缓冲区并从中上传。
如果您没有文件空间或内存空间,那么:
创建"沉没" outputStream,它只计算写入的字节数,以计算标称文件大小。
创建/写入ZIP文件到接收器,并捕获文件大小。
打开您的连接以进行上传。
发送包含文件大小的元数据。
第二次创建/写入ZIP,写入套接字流......或其他任何内容。
这3种方法都允许您创建和发送压缩ZIP,如果这将有所帮助。
如果您坚持尝试一次性动态执行此操作,那么您将需要在法医详细信息中阅读ZIP文件规范...并执行一些混乱的算法。帮助你可能超出了SO问题的范围。