2016-05-16 127 views
1

我正在实施帮助程序类来处理来自我的Web应用程序的从AWS S3存储的传输。将文件下载到流而不是文件

在我班的第一个版本中,我直接使用AmazonS3Client来处理上传和下载,但现在我发现了TransferManager,我想重构我的代码以使用它。

问题是,在我的下载方法中,我以byte[]的形式返回存储的文件。 TransferManager改为只有使用File作为下载目标的方法(例如download(GetObjectRequest getObjectRequest, File file))。

我以前的代码是这样的:

GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, key); 
S3Object s3Object = amazonS3Client.getObject(getObjectRequest); 
S3ObjectInputStream objectInputStream = s3Object.getObjectContent(); 
byte[] bytes = IOUtils.toByteArray(objectInputStream); 

是否有使用TransferManager以同样的方式,或者我应该简单地继续使用AmazonS3Client实例的方式吗?

+1

将所有字节载入内存不是一个好习惯。考虑返回文件并打开一个输入流来读取它,这样在处理大文件时应用程序不会崩溃。 – andrucz

回答

3

TransferManager使用File对象在并行下载片段时支持文件锁定等操作。直接使用OutputStream是不可能的。如果您的要求很简单,比如一次下载S3中的小文件,请坚持使用getObject

否则,您可以使用File.createTempFile创建一个临时文件,并在下载完成后将内容读入字节数组中。

+0

谢谢你的解释。我将使用临时文件。 – davioooh

相关问题