Я продолжаю процесс архивирования, который ранее был запущен другим методом. Мне нужно начать bytes
после ZipEntry
. Я пропустил bytes
в InputStream
, но мне нужно пропустить ZipEntry
, чтобы соответствовать.
inputStream.skip(bytesToSkip)
Как мне сопоставить ZipEntry с соответствующим? Я использовал
zipOutputStream.putNextEntry(new ZipEntry(object.getKey()))
Это помещает поток в начало, поэтому, когда я снова начинаю потоковую передачу, он передает поток InputStream
в пропущенную точку и помещает его в начало ZipOutputStream
. Мне нужно настроить его, чтобы пропустить некоторые bytes
.
Есть ли что-то подобное?
zipEntry.skip(bytesToSkip)
Может быть, я лаю не на том дереве. Любая помощь приветствуется.
РЕДАКТИРОВАТЬ: Обновлено по адресу Ramsay
В моем сценарии я использую AWS Lambda Function
, чтобы заархивировать папку с файлами разных размеров. Когда в AWS Lambda Function
осталось немного времени, я должен все почистить и позвонить другому AWS Lambda Function
, чтобы закончить начатое. Второй AWS Lambda Function
должен определить, где остановился последний, поэтому я пропускаю байты в InputStream
, чтобы продолжить там, где он остановился.
Так что в сценарии, где первый AWS Lambda Function
был в середине архивирования файла1, я думаю, что я получаю плохие файлы ZIP, потому что второй AWS Lambda Function
пропускает байты из InputStream
файла1, но когда я установил zipOutputStream.putNextEntry(new ZipEntry(object.getKey()))
, он «помещает поток в начало». Это не совпадает с серединой файла1, откуда я хочу забрать.
Кроме того, есть вероятность, что я могу ошибаться, и это не приводит к созданию плохих почтовых файлов.
Вот некоторые фрагменты кода:
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());
}
}