Пропустить байты в ZipEntry для ZipOutputStream - PullRequest
0 голосов
/ 26 апреля 2018

Я продолжаю процесс архивирования, который ранее был запущен другим методом. Мне нужно начать 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());
    }
}

1 Ответ

0 голосов
/ 27 апреля 2018

Я думаю, вам нужно спросить себя, что вы подразумеваете под «пропускать байты в выводе». На входе это имеет значение, потому что вы эффективно игнорируете байты во время чтения, но что это значит на выходе?

Когда вы пишете в поток, вы пишете непрерывный поток байтов. Если вы пропускаете , вы имеете в виду, что вы хотите установить патч «no bytes» в записи назначения zip? Что это значит? Возможно, если вы объясните, при каких обстоятельствах вы можете пропустить байты во входных данных, мы поймем, почему вы можете пропустить байты в выходных данных.

Или, возможно, вы действительно хотите, чтобы новая запись Zip начиналась там, где вы начинаете использовать байты из входного потока?

...