gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:31:37 25 4
gpt4 key购买 nike

使用 ByteArrayOuputStream 输出的 Zip 文件比使用 FileOutputStream 输出的小。

在 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 Controller 中,因此单击网页上的链接将下载 zip 文件,而无需接触除用户之外的任何文件系统。

这是使用 FileOutputStream 的代码,它可以工作......

        FileOutputStream baos = new FileOutputStream("TEST_AS_FILE.zip");
zipOS = new ZipOutputStream(baos);

除了第二个代码片段不相关,因为我需要发送在网络服务器上创建的文件。但重点是,逻辑相同的Fileoutput流和ByteArrayOutputStream有区别。

最佳答案

下列说法错误的是:

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

writeTo(OutputStream out) 的 javadoc没有说任何关于关闭 OutputStream 的事情,这意味着它没有,所以最后的数据仍然缓冲在未关闭、未刷新的 FileOutputStream 中.

正确的做法是:

try (OutputStream out = new FileOutputStream("TEST_AS_BYTESTREAM_1.zip")) {
baos.writeTo(out);
}
<小时/>

另外,一个 ByteArrayOutputStream不需要关闭或冲洗。作为close()的javadoc说:

Closing a ByteArrayOutputStream has no effect.

但是您需要调用 finish()ZipOutputStream来完成内容。由于关闭 zip 流会自动为您完成操作,因此正确的方法是:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ZipOutputStream zipOS = new ZipOutputStream(baos)) {
// create the Zip file content here
}
try (OutputStream out = new FileOutputStream("TEST_AS_BYTESTREAM_1.zip")) {
baos.writeTo(out);
}

直接写入文件时:

try (ZipOutputStream zipOS = new ZipOutputStream(new FileOutputStream("TEST_AS_FILE.zip"))) {
// create the Zip file content here
}

考虑添加 BufferedOutputStream 以获得更好的性能。

关于使用 ByteArrayOutputStream 创建的 Java Zip 文件比使用 FileOutputStream 创建的文件小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59661324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com