Java 将内容流式传输到谷歌云存储

Java 将内容流式传输到谷歌云存储,java,google-cloud-storage,nio,Java,Google Cloud Storage,Nio,我想上传一个大的集合到谷歌云存储。我可以这样做: Blob result = storage.create(blobInfo, Joiner.on('\n').join(set).getBytes(UTF_8)); 但这将创建一个包含所有可能过大内容的中间字符串。 我发现了一个带有WriteChannel.write()的 Set=。。。 String bucketName=“我唯一的bucket”; String blobName=“我的blob名称”; BlobId BlobId=Blob

我想上传一个大的
集合
到谷歌云存储。我可以这样做:

Blob result = storage.create(blobInfo, Joiner.on('\n').join(set).getBytes(UTF_8));
但这将创建一个包含所有可能过大内容的中间字符串。
我发现了一个带有
WriteChannel.write()的

Set=。。。
String bucketName=“我唯一的bucket”;
String blobName=“我的blob名称”;
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(writechannelwriter=storage.writer(blobInfo)){
write.write(ByteBuffer.wrap(content,0,content.length));
}捕获(IOEX异常){
//处理异常
}
但是,如果我这样做,整个
将转换为字符串,然后转换为
字节[]
。绳子本身可能太大了


有没有一个例子可以说明如何迭代集合并将其转换为ByteBuffer?或者我应该在集合的块上执行循环吗?

以避免创建包含所有可从文件上载的字节的中间字符串。您可以找到用各种语言从文件上传的示例代码。

我能想到的最简单的方法是:

 try (WriteChannel writer = storage.writer(blobInfo)) {
   for(Integer val : set) {
     String valLine = val.toString() + '\n';
     writer.write(ByteBuffer.wrap(valLine.getBytes(UTF_8));
   }
 }

请注意,这不是很有效。它产生了许多小的副缓冲器。您可以通过将其写入一个较大的ByteBuffer并定期调用writer.write来对此进行改进。

从文件上载没有帮助,因为我想直接从集合上载。我不清楚“它不显示如何迭代字节”是什么意思。也许你可以编辑这个问题来展示你到目前为止所拥有的代码,以及你所坚持的或没有按照你的方式工作的具体内容。在java中,在通道之间读写数据通常并不困难。如果您对java通道API有疑问,那么您应该将问题集中在这一点上。我试图澄清这个问题。我不确定我是在寻找不同的GCP api还是不同的NIO api。您的问题似乎是
Joiner.on('\n').join(set)
返回内存中的完整字节数组。如果您想流式传输源数据,您需要一个流式传输字节内容的API,而不是一次返回所有内容。谢谢,这与
迭代器一起使用。分区
看起来更好。