gpt4 book ai didi

java - 如何在 appengine java 应用程序中创建包含谷歌云存储对象的 zip 存档?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:51:37 24 4
gpt4 key购买 nike

假设我有 50 个对象(每个 15Mb)存储在 Google Cloud Storage 中。现在我需要创建一个包含所有这些文件的 zip 存档并将生成的文件存储回 GCS。我怎样才能在 Appengine Java 应用程序中做到这一点?

最佳答案

我写了下面的方法,它似乎工作正常。

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();
}
}

关于java - 如何在 appengine java 应用程序中创建包含谷歌云存储对象的 zip 存档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17871412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com