2016-11-24 137 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視頻。我正在嘗試使用範圍請求對視頻進行流式傳輸,以便爲最終用戶進行快速轉發和倒帶。當我使用普通的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(); 
}