我正在继续之前由另一种方法启动的压缩过程。我需要在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());
}
}
答案 0 :(得分:2)
我认为你需要问自己你的意思是&#39;跳过输出中的字节&#39;。在输入中,它具有意义,因为您在读取时有效地忽略了字节,但它在输出中意味着什么?
当您写入流时,您正在编写连续的字节流。如果您跳过,那么您是否想要一个没有字节的补丁&#39;在目标zip条目?那是什么意思?也许如果你解释在什么情况下你可能会跳过输入中的字节,我们就会理解为什么你可能想要跳过输出中的字节。
或许你真的想要一个新的Zip条目从你开始使用输入流中的字节开始?