2016-11-24 13 views
0

のサイズを考え出す私は現在、以下のようにAmazonのS3ストレージを使用して、入力ストリームを取得しています:のInputStream

public static InputStream getResourceAsStream(String fileKey) { 
    AmazonS3 s3Client = new AmazonS3Client(new ProfileCredentialsProvider()); 
    return s3Client.getObject(new GetObjectRequest(bucketName, fileKey)).getObjectContent(); 
} 

私が扱ってるファイルは.MP4動画です。私は、Range-Requestsを使ってビデオをストリーミングして、エンドユーザの早送りと巻戻しを可能にしようとしています。通常のFileオブジェクトを使用していたときにストリーミングが正常に機能していましたが、ローカルマシンに保存されているファイルを使用する代わりにAmazon S3からストリーミングを受信して​​います。

このストリームの長さを調べるにはどうすればよいですか?前に、私はこれでした:

Long length = Files.size(filepath); 

をしかし、私はJavaコードを実行しているマシン上で直接保存されたファイルを持っていないようになりましたこれは動作しません。 InputStreamの長さを調べる方法はありますか?

+1

号は 'InputStream'はバイトのストリームで、大きさを知るための唯一の方法は、これ以上のバイトが返されなくなるまで読むことです。 – Kayaman

+0

@ Kayamanだから私は 'InputStream'を読んで、バイトが返されるまでバイト配列にバイトを格納し、バイト配列のサイズをチェックする必要がありますか? –

+0

通常はありません。信じられないほどの量の記憶が残っているので、通常はその周りにデザインする必要があります。 – Kayaman

答えて

1

最初から最後まで読んでから自分で読み込んだバイト数を数えない限り、InputStreamの長さを取得することはできません。

あなたはしかしS3Objectの長さを得ることができます。

public static InputStream getResourceAsStream(String fileKey) { 
    AmazonS3 s3Client = new AmazonS3Client(new ProfileCredentialsProvider()); 
    S3Object obj = s3Client.getObject(new GetObjectRequest(bucketName, fileKey)); 
    long length = obj.getObjectMetadata().getInstanceLength(); 
    //use length 
    return obj.getObjectContent(); 
}