作为我的Web服务的一部分,我有一个图片存储库,该存储库从Amazon S3(数据存储)中检索图像,然后将其返回。这是执行此操作的方法的外观:
File getPicture(String path) throws IOException {
File file = File.createTempFile(path, ".png");
S3Object object = s3Client.getObject(new GetObjectRequest(bucketName, path));
IOUtils.copy(object.getObjectContent(), new FileOutputStream(file));
return file;
}
问题在于从服务获得响应的时间太长-(一个3MB的图像花了7.5秒下载时间)。我注意到,如果我注释掉IOUtils.copy()行,则响应时间明显加快,因此,一定是导致这种延迟的特定方法。
我已经看到几乎所有将S3Object转换为文件的现代示例都使用了这种方法,但我似乎是一个特例。我在这里错过了一个把戏吗?
感谢任何帮助!
答案 0 :(得分:2)
从AWS文档中:
public S3Object getObject(GetObjectRequest getObjectRequest)
返回的Amazon S3对象包含来自HTTP连接的直接数据流。在用户完成读取数据并关闭流之前,基础HTTP连接无法重用。
public S3ObjectInputStream getObjectContent()
注意:该方法是一个简单的getter,实际上并不创建流。如果您检索S3Object,则应尽快关闭此输入流,因为对象内容未缓存在内存中,而未直接从Amazon S3流化。
如果删除IOUtils.copy
行,则方法会快速退出,因为您实际上并未处理该流。如果文件很大,将需要一些时间来下载。除非您可以更好地连接到AWS服务,否则您将无能为力。