2017-10-03 26 views
0

Amazon S3からRAMに大きなファイルをダウンロードしたいと思います。ファイルはRAMサイズより大きくなります。私は部品でそれをロードする必要があるようだ。各部分はエンドポイントに戻るでしょう。 また、そこにダウンロードしたファイルを保存するためにハードドライブを使用することはできません。 私はInputStreamオブジェクトを持っていると私は以下のようにオブジェクトをロードしようとしています:Amazon S3から大きなファイルをダウンロード

inputStream.skip(totalBytes); 
    long downloadedBytesCount = 0; 
    ByteArrayOutputStream result = new ByteArrayOutputStream(); 
    byte[] buffer = new byte[1024]; 
    int length; 
    do { 
     length = inputStream.read(buffer); 
     result.write(buffer, 0, length); 
     downloadedBytesCount += length; 
    } 
    while (downloadedBytesCount <= partOfFileSize && (length != -1)); 
    totalBytes += downloadedBytesCount; 

が、そのコードは、問題が含まれています。それぞれの新しい要求は、(例えば、20メガバイトのために)ダウンロードするために始めるので、最後のリクエストからダウンロードしたファイルを起動しますすべてのファイル(たとえば1 GB)をダウンロードします。だから、方法skip(long)は期待どおりに動作しません。

inputStreamからファイルをダウンロードするにはどうすればよいですか?助言がありますか?

+0

私の知る限り、inputStreamは複数のソースを持つことができないため、このために作られていません。 –

答えて

1

標準S3ライブラリが好きなファイルの部分転送することができます:

は、あなたのプログラムで

GetObjectRequest rangeObjectRequest = new GetObjectRequest(
     bucketName, key); 
rangeObjectRequest.setRange(0, 10); // retrieve 1st 11 bytes. 
S3Object objectPortion = s3Client.getObject(rangeObjectRequest); 

InputStream objectData = objectPortion.getObjectContent(); 

AWS docsから取られた)あなたは、例えば、一度に1000のバイトを読むことができます範囲を動かすことによって。

関連する問題