Как создать zip-архив, содержащий объекты облачного хранилища Google, в приложении appengine java?

Допустим, у меня есть 50 объектов (по 15 МБ каждый), хранящихся в Google Cloud Storage. Теперь мне нужно создать zip-архив, содержащий их все, и сохранить полученный файл обратно в GCS. Как я могу сделать это из java-приложения appengine?


person Fábio Uechi    schedule 26.07.2013    source источник
comment
Вы можете использовать ZipOutputStream. В этом ответе есть большая часть того, что вам нужно для начала работы.   -  person jterrace    schedule 26.07.2013
comment
Написал метод выше на основе вашей рекомендации. Просто пока не знаю, как проверить целостность данных.   -  person Fábio Uechi    schedule 28.07.2013
comment
Вы должны опубликовать это как ответ, а не в вопросе, если это работает. Что вы подразумеваете под целостностью?   -  person jterrace    schedule 28.07.2013


Ответы (1)


Я написал метод ниже, который, кажется, работает нормально.

public static void zipFiles(final GcsFilename targetZipFile,
        final GcsFilename... filesToZip) throws IOException {

    Preconditions.checkArgument(targetZipFile != null);
    Preconditions.checkArgument(filesToZip != null);
    Preconditions.checkArgument(filesToZip.length > 0);

    final int fetchSize = 4 * 1024 * 1024;
    final int readSize = 2 * 1024 * 1024;
    GcsOutputChannel outputChannel = null;
    ZipOutputStream zip = null;
    try {
        GcsFileOptions options = new GcsFileOptions.Builder().mimeType(MediaType.ZIP.toString()).build();
        outputChannel = GCS_SERVICE.createOrReplace(targetZipFile, options);
        zip = new ZipOutputStream(Channels.newOutputStream(outputChannel));
        GcsInputChannel readChannel = null;
        for (GcsFilename file : filesToZip) {
            try {
                final GcsFileMetadata meta = GCS_SERVICE.getMetadata(file);
                if (meta == null) {
                    LOGGER.warning(file.toString() + " NOT FOUND. Skipping.");
                    continue;
                }
                //int fileSize = (int) meta.getLength();
                //  LOGGER.fine("adding " + file.toString());
                ZipEntry entry = new ZipEntry(file.getObjectName());
                zip.putNextEntry(entry);
                readChannel = GCS_SERVICE.openPrefetchingReadChannel(file, 0, fetchSize);
                final ByteBuffer buffer = ByteBuffer.allocate(readSize);
                int bytesRead = 0;
                while (bytesRead >= 0) {
                    bytesRead = readChannel.read(buffer);
                    buffer.flip();
                    zip.write(buffer.array(), buffer.position(), buffer.limit());
                    buffer.rewind();
                    buffer.limit(buffer.capacity());
                }       

            } finally {
                zip.closeEntry();
                readChannel.close();
            }
        }
    } finally {
        zip.flush();
        zip.close();
        outputChannel.close();
    }
}
person Fábio Uechi    schedule 27.07.2013
comment
что мне делать, если размер почтового индекса больше допустимого в 30M? - person RCB; 09.06.2016