Java 无法打开使用spring boot下载的S3 zip文件

Java 无法打开使用spring boot下载的S3 zip文件,java,spring-boot,amazon-s3,Java,Spring Boot,Amazon S3,我的AWS S3包含一些文件,我想通过我的应用程序以zip文件的形式下载这些文件。我能够成功下载zip文件,但当文件出现错误时,我得到了一个意外的存档结束,而且zip中的CSV文件大小为0 我确实挖了很多,但无法理解确切的答案 代码如下: 字符串zipFileName=MyZipFile.zip; 字符串文件名=test.csv; filePath=新的StringBase64.getDecoder.decodefilePath; System.out.printlnfile:+filePath

我的AWS S3包含一些文件,我想通过我的应用程序以zip文件的形式下载这些文件。我能够成功下载zip文件,但当文件出现错误时,我得到了一个意外的存档结束,而且zip中的CSV文件大小为0

我确实挖了很多,但无法理解确切的答案

代码如下:

字符串zipFileName=MyZipFile.zip; 字符串文件名=test.csv; filePath=新的StringBase64.getDecoder.decodefilePath; System.out.printlnfile:+filePath; //从S3获取文件 S3Object s3Obj=awsClient.downloadFilePath; byte[]s3Bytes=s3Obj.getObjectContent.readAllBytes; //创建拉链 ByteArrayOutputStream byteArrOutputStream=新建ByteArrayOutputStreams3Bytes.length; zipOutStream zipOutStream=新ZipoutStreamByTearOutStream; ZipEntry zip=新的ZipEntryfileName; zipOutStream.putnextryzip; zipOutStream.writes3Bytes,0,s3Bytes.length; byte[]streamBytes=byteArrOutputStream.toByteArray; //合流 zipOutStream.closeEntry; 紫苏流; closeQuietlybyteArrOutputStream; //准备下载 System.out.printlnstreamBytes:+streamBytes+len:+streamBytes.length; System.out.printlns3Bytes:+s3Bytes+len:+s3Bytes.length; HttpHeaders=新的HttpHeaders; headers.setContentTypeMediaType.APPLICATION_OCTET_流; headers.setContentLengthstreamBytes.length; headers.setContentDispositionFormDataattachment,zipFileName;
我认为您应该关闭zip输出流,以便在提取字节数组之前将所有内容写入底层字节数组流。。。Ie将行重新排序为:

// close streams
zipOutStream.closeEntry();
zipOutStream.close();
byte[] streamBytes = byteArrOutputStream.toByteArray();
closeQuietly(byteArrOutputStream);

你能解释一下为什么这很重要吗?zip流有它自己的缓冲区,当你关闭它时,它会被刷新到下一个流。直到在此之后,数据在字节数组输出stream.zipOutStream.closeEntry中可用;当有zipOutStream时不需要。关闭;就在那之后。此外,如果closeQuietlybyteArrOutputStream;按照名称所示,它也过时了,因为ByteArrayOutputStream不需要关闭,如果关闭了,关闭操作再次放错位置,在toByteArray调用之后。zipOutStream.close已经调用了底层ByteArrayOutputStream上的close…