使用ByteArrayOuputStream的Zip文件输出小于使用FileOutputStream的Zip文件输出。
在Java中,我正在创建一个Zip文件。当我使用FileOutputStream时,打开成功。
当将FileOutputStream切换到ByteArrayOutputStream时,我得到一个较小的文件,大约221个字节。并且该文件无法打开,但内容与其他文件相同,但缺少221个字节。
我用来构造Zip文件的逻辑在两种情况下都是相同的。因此,我将在不创建zip的情况下共享基本逻辑(让我知道是否需要此压缩包)。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
zipOS = new ZipOutputStream(baos);
然后创建Zip文件,然后...
zipOS.flush();
baos.flush();
baos.writeTo(new FileOutputStream("TEST_AS_BYTESTREAM_1.zip"));
zipOS.close();
baos.close();
我正在使用baos.writeTo()绕过此操作,以证明这不是问题,而并非是HTTP响应,而是ByteArrayOutputStream元素。
使用baos.writeTo(new FileOutputStream("TEST_AS_BYTESTREAM_1.zip"));
时我得到了一个较小的文件,无法以Zip格式打开。
此逻辑在Java控制器中,因此,在网页上单击的链接将下载zip文件,而无需触摸用户以外的任何文件系统。
这是使用FileOutputStream的代码,可以正常工作...
FileOutputStream baos = new FileOutputStream("TEST_AS_FILE.zip");
zipOS = new ZipOutputStream(baos);
除了第二个代码段不相关,因为我需要发送在Web服务器上创建的文件。但是关键是,具有相同逻辑的Fileoutput流和ByteArrayOutputStream有区别。
以下陈述是错误的:
baos.writeTo(new FileOutputStream("TEST_AS_BYTESTREAM_1.zip"));
writeTo(OutputStream out)
的javadoc没有说任何关于关闭writeTo(OutputStream out)
的信息,这意味着没有这样做,因此最后的数据仍位于未关闭的OutputStream
中。
正确的方法是:
FileOutputStream