2016-11-24 3 views
0

В настоящее время я получаю входной поток, используя хранилище 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

No. '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(); 
} 
Смежные вопросы