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

Java 带有输入和输出流的IOUtils.copy()非常慢,java,amazon-web-services,file,amazon-s3,ioutils,Java,Amazon Web Services,File,Amazon S3,Ioutils,作为web服务的一部分,我有一个图片存储库,它从AmazonS3(一个数据存储)检索图像,然后返回它。这是执行此操作的方法的外观: File getPicture(String path) throws IOException { File file = File.createTempFile(path, ".png"); S3Object object = s3Client.getObject(new GetObjectRequest(bucketName, path));

作为web服务的一部分,我有一个图片存储库,它从AmazonS3(一个数据存储)检索图像,然后返回它。这是执行此操作的方法的外观:

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()行,响应时间会明显加快,因此一定是特定的方法导致了这种延迟

我在几乎所有将S3对象转换为文件的现代示例中都见过这种方法,但我似乎是一个独特的例子。我错过了一个技巧吗


谢谢你的帮助

来自AWS文件:

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

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



如果删除
IOUtils.copy
行,则方法会很快退出,因为您实际上并不处理流。如果文件很大,则需要时间下载。除非您能够更好地连接到AWS服务,否则您无法解决这一问题。

我无法解决您的实际问题,但您可能希望用try-with-resource语句来包装流。根据IOUtils文档,它不会关闭您传入的流--那么谁负责关闭FileOutputStream?谢谢-我已经尝试过关闭输出流,但没有帮助,所以一定是特定的方法导致了延迟,或者您在第二次下载之前已经下载了文件,这使得第二次下载速度更快,由于代理和缓存的原因。我为每个场景多次下载了该文件(以及多个文件)。请指出您正在使用的IOUTIL。至少要包括包名。有几十个库都有一个名为
IOUtils
-例如,AWS Java SDK,还有流行的apache commons库。这太奇怪了,直到几天前,响应时间已经好几个月了,我已经很长时间没有接触过这个代码了。@eyesenberg有很多外部因素可以减缓响应速度。网络速度、磁盘/存储R/W速度、AWS端的因素等。可以尝试将所有S3对象读取到一个字节数组中。这至少会告诉您问题是否在
IOUtils
/磁盘速度范围内。