使用ByteArrayOutputStream创建的Java Zip文件小于使用FileOutputStream创建的Java Zip文件

问题描述 投票:0回答:1

使用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有区别。

java zip fileoutputstream bytearrayoutputstream
1个回答
0
投票

以下陈述是错误的:

baos.writeTo(new FileOutputStream("TEST_AS_BYTESTREAM_1.zip"));

writeTo(OutputStream out)的javadoc没有说任何关于关闭writeTo(OutputStream out)的信息,这意味着没有这样做,因此最后的数据仍位于未关闭的OutputStream中。

正确的方法是:

FileOutputStream
© www.soinside.com 2019 - 2024. All rights reserved.