2016-02-10 52 views
0

我有一個Java應用程序,需要從亞馬遜S3做快速可靠的下載。理想情況下,我會使用類似AWS SDK的TransferManager(http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html)之類的東西,除非我想以流式方式處理數據,而不必將所有下載的數據放在本地磁盤上。S3多線程下載庫

理想情況下,庫應該有一個類似於AmazonS3#getObject()的接口,但實現會更快,更健壯。更好的是,庫會支持多個S3對象的預取:我可以給它一個我想要最終下載的對象列表,然後爲每個對象快速消耗一系列流。如果庫需要使用大量的RAM來執行預取,那沒關係。

有人知道有一些/所有這些功能的圖書館嗎?

回答

0

我會建議使用minio-java

Java庫亞馬遜S3支持雲存儲

io.minio.MinioClient.getObject返回的InputStream[example],你可以做多getObject每個調用返回個人InputStream

MinioClient s3Client = new MinioClient("https://s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY"); 
InputStream stream1 = s3Client.getObject("my-bucketname", "my-objectname1"); 
InputStream stream2 = s3Client.getObject("my-bucketname", "my-objectname2"); 

這裏,這些流不被預取。如果預取是硬性要求,你可以使用GetObject的另一種變體

公共無效的getObject(字符串bucketName,字符串對象名,字符串文件名),使用這種方法的

優點是,它恢復以前的getObject(如果有的話)。

MinioClient s3Client = new MinioClient("https://s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY"); 
s3Client.getObject("my-bucketname", "my-objectname1", "/mycachedir/my-objectname1"); 
s3Client.getObject("my-bucketname", "my-objectname2", "/mycachedir/my-objectname2"); 
+0

感謝這個響應,但在看代碼,的getObject()的調用映射到單個HTTP GET請求:https://github.com/minio/minio-java/blob/a8c9ffa1919e47b743dffabc9eb756847016263a/src /main/java/io/minio/MinioClient.java#L487這將在AWS SDK的getObject()實現中遇到類似的魯棒性和速度限制。你提到的重載功能對於需要文件名的重載來說看起來很不錯(並且可以使事情更健壯),但理想情況下,我可以從關閉的連接中恢復,而不必將整個下載存儲在磁盤上。 –