要使用java SDK从S3下载文件,我们需要执行以下操作 - > 注意 - Multipart下载已关闭。
S3Object s3Object = s3.getObject(getObjectRequest);
S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent();
//Write to a file from this stream
当我们进行getObject调用时,SDK会对该对象执行GET调用。 此调用仅返回响应的标头。
当我们真正开始从s3ObjectInputStream中读取时,我们得到了响应体。 但这一切都是一个REST调用。
所以,我很困惑,为什么调用首先只返回标题。 S3如何知道何时开始在响应主体中发送?
我们只进行一次调用,所以我们如何通知S3我们现在已经开始从s3ObjectInputStream中读取。 实际文件存储在哪里,直到我们从流中读取它?
答案 0 :(得分:0)
S3立即开始发送响应正文。
您还没有开始从网络上阅读它。
getObject
使用此方法时要格外小心;返回的Amazon S3对象包含来自HTTP连接的直接数据流。在用户完成读取数据并关闭流之前,不能重用基础HTTP连接。
少量已缓冲,但对象未存储在任何地方。网络连接已停止。 如果您要在启动请求并等待足够长时间才能读取它,S3最终会检测到连接是否已停顿,放弃并关闭连接。
实际上,很容易将HTTP标头与流中的主体分开,因为它们之间的边界始终是\r\n\r\n
。这个4字节序列在标题中是无效的,并且在标题之后是必需的,因此SDK只是在S3的响应中停止提取标题并构建并返回响应对象,您可以从该对象中读取来自网络。