具有输入和输出流的IOUtils.copy()非常慢

时间:2018-11-23 00:31:16

标签: java amazon-web-services file amazon-s3 ioutils

作为我的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转换为文件的现代示例都使用了这种方法,但我似乎是一个特例。我在这里错过了一个把戏吗?

感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

从AWS文档中:

public S3Object getObject(GetObjectRequest getObjectRequest)

  

返回的Amazon S3对象包含来自HTTP连接的直接数据流。在用户完成读取数据并关闭流之前,基础HTTP连接无法重用。

public S3ObjectInputStream getObjectContent()

  

注意:该方法是一个简单的getter,实际上并不创建流。如果您检索S3Object,则应尽快关闭此输入流,因为对象内容未缓存在内存中,而未直接从Amazon S3流化。


如果删除IOUtils.copy行,则方法会快速退出,因为您实际上并未处理该流。如果文件很大,将需要一些时间来下载。除非您可以更好地连接到AWS服务,否则您将无能为力。