【发布时间】:2020-10-20 18:33:16
【问题描述】:
我想将一个大的 Set<Integer> 上传到 Google Cloud Storage。我可以这样做:
Blob result = storage.create(blobInfo, Joiner.on('\n').join(set).getBytes(UTF_8));
但这会创建一个中间字符串,其中包含可能太大的所有内容。
我找到了example 和WriteChannel.write():
Set<Integer> set = ...
String bucketName = "my-unique-bucket";
String blobName = "my-blob-name";
BlobId blobId = BlobId.of(bucketName, blobName);
byte[] content = Joiner.on('\n').join(set).getBytes(UTF_8);
BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("text/plain").build();
try (WriteChannel writer = storage.writer(blobInfo)) {
writer.write(ByteBuffer.wrap(content, 0, content.length));
} catch (IOException ex) {
// handle exception
}
但是,如果我这样做,整个set 将转换为字符串,然后转换为byte[]。字符串本身可能太大了。
是否有一个如何迭代集合并将其转换为 ByteBuffer 的示例?还是我应该对集合的块做一个循环?
【问题讨论】:
-
我不清楚您所说的“它没有显示如何迭代字节”是什么意思。也许您可以编辑问题以显示到目前为止的代码,以及您遇到的具体问题或未按您预期的方式工作。在java中,channel之间的数据读写一般不难。如果您对 java 通道 API 有疑问,那么您应该将问题集中在这个问题上。
-
我试图澄清这个问题。我不确定我是在寻找不同的 GCP api 还是不同的 NIO api。
-
似乎您的问题是
Joiner.on('\n').join(set)返回内存中的完整字节数组。如果要流式传输源数据,则需要一个 API 来流式传输字节内容,而不是一次返回所有内容。
标签: java google-cloud-storage nio