在ZipEntry中为ZipOutputStream

时间:2018-04-26 20:48:26

标签: java stream zip

我正在继续之前由另一种方法启动的压缩过程。我需要在bytes之后开始一些ZipEntry。我在bytes中跳过了一些InputStream,但我需要跳过ZipEntry才能匹配。

inputStream.skip(bytesToSkip)

如何匹配ZipEntry以匹配?我一直在使用

zipOutputStream.putNextEntry(new ZipEntry(object.getKey()))

这会将流放在开头,所以当我再次开始流式传输时,它会将InputStream流式传输到跳过的点并将其放在ZipOutputStream的开头。我需要调整它以跳过一些bytes

有类似的东西吗?

zipEntry.skip(bytesToSkip)

也许我正在咆哮错误的树。任何帮助表示赞赏。

编辑:更新以解决拉姆齐

在我的场景中,我使用AWS Lambda Function来压缩不同大小的文件夹。当AWS Lambda Function中只剩下一点时间时,我必须清理所有内容并调用另一个AWS Lambda Function来完成我的开始。第二个AWS Lambda Function必须选择最后一个停止的位置,因此我跳过InputStream中的字节继续停止的位置。

因此,在第一个AWS Lambda Function正在压缩文件1的情况下,我认为我收到了糟糕的zip文件,因为第二个AWS Lambda Function跳过来自InputStream的{​​{1}}个字节file1,但是当我设置zipOutputStream.putNextEntry(new ZipEntry(object.getKey()))时,它“将流放在开头”。这与我想要从中获取的file1的中间部分不匹配。

此外,我可能会出错,这不会导致它产生的糟糕的zip文件。

以下是一些代码段:

private void upload(ZipOutputStream zipOutputStream) {
    try {
        ListObjectsV2Result result;
        int lenProgress = 0;
        do {
            result = s3Client.listObjectsV2(listObjectsRequest);
            for (S3ObjectSummary objectSummary : result.getObjectSummaries()) {
                try {
                    S3Object object = s3Client.getObject(objectSummary.getBucketName(), objectSummary.getKey());
                    try (InputStream inputStream = object.getObjectContent()) {
                        inputStream.skip(bytesToSkip );
                        bytesToSkip = 0;
                        byte[] buffer = new byte[BYTE_SIZE];
                        int len;
                        zipOutputStream.putNextEntry(new ZipEntry(object.getKey()));
                        while ((len = inputStream.read(buffer)) > 0) {
                            zipOutputStream.write(buffer, 0, len);
                            lenProgress += len;
                            if (context.getRemainingTimeInMillis() < ALARM) {
                                cleanUp(lenProgress);
                                return;
                            } 
                        }
                    }
                    lenProgress = 0;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            String nextContinuationToken = result.getNextContinuationToken();
            listObjectsRequest.setContinuationToken(nextContinuationToken);
        } while (result.isTruncated() == true);
    } catch (AmazonServiceException ase) {
        System.out.println("Caught an AmazonServiceException, " + "which means your request made it "
                + "to Amazon S3, but was rejected with an error response " + "for some reason.");
        System.out.println("Error Message:    " + ase.getMessage());
        System.out.println("HTTP Status Code: " + ase.getStatusCode());
        System.out.println("AWS Error Code:   " + ase.getErrorCode());
        System.out.println("Error Type:       " + ase.getErrorType());
        System.out.println("Request ID:       " + ase.getRequestId());
    } catch (AmazonClientException ace) {
        System.out.println("Caught an AmazonClientException, " + "which means the client encountered "
                + "an internal error while trying to communicate" + " with S3, "
                + "such as not being able to access the network.");
        System.out.println("Error Message: " + ace.getMessage());
    }
}

1 个答案:

答案 0 :(得分:2)

我认为你需要问自己你的意思是&#39;跳过输出中的字节&#39;。在输入中,它具有意义,因为您在读取时有效地忽略了字节,但它在输出中意味着什么?

当您写入流时,您正在编写连续的字节流。如果您跳过,那么您是否想要一个没有字节的补丁&#39;在目标zip条目?那是什么意思?也许如果你解释在什么情况下你可能会跳过输入中的字节,我们就会理解为什么你可能想要跳过输出中的字节。

或许你真的想要一个新的Zip条目从你开始使用输入流中的字节开始?