2011-12-14 3 views
3

Как говорится в названии, мне нужно знать, сколько байтов у файла есть «позади» InputStream. Я не хочу загружать все байты и считать (занимает много времени). Мне просто нужно знать, сколько байтов имеет файл.Получите количество байтов файла за Java InputStream

Как это:

int numberOfBytes = countBytes(inputStream); 

Итак, мне нужна реализация для countBytes (InputStream InputStream)

+0

Взгляните на это сообщение: http://stackoverflow.com/questions/116574/java-get-file-size-efficiently –

+1

У вас есть доступ к этому файлу или только InputStream? – Todd

+0

@Todd Я получил поток, который ссылается на вложение электронной почты на imap-сервере через Javamail API. – Timo

ответ

8

Кроме потребляя весь поток и подсчет байт, вы не может (нет API для этого).

Там же метод available(), но это совершенно явно не делать то, что вы спрашиваете:

Обратите внимание, что в то время как некоторые реализации InputStream возвращает общее число байтов в потоке, многие не.

Если InputStream связан с файлом (а не, скажем, сокетом), возможно, вы можете использовать другой API для получения его размера?

+0

Нет, я думаю, что это сокет. Входной поток относится к приложению электронной почты через Javamail. – Timo

+0

Hi @Timo вы нашли какое-нибудь другое решение для этого? – StrawhatLuffy

+0

@StrawhatLuffy Извините, это так давно, я не помню :-) – Timo

2

Не могли бы вы использовать skip() в некотором роде, чтобы приблизиться к размеру файла?

int bytes = 1024; // Chunk size for skipping. Adjust as necessary 
try { 
    int skipped = 0; 
    while(stream.available()) { 
     stream.skip(bytes); 
     skipped += bytes; 
     // Elided...do something with skipped 
    } 
} catch(IOException ex) { 
    // Handle a skip that's too big 
} 

Я уверен также, что вы могли бы сделать эту петлю умнее и избежать неизбежного IOException, но это упражнение читателю.

+0

Как я уже говорил, мне нужен размер EXACT byte – Timo

+0

Тогда вы можете пропустить один байт за раз? Зачем вам нужен точный размер? –

+0

Я загружаю файл в Dropbox, и его API требует точного количества байтов, которые я загружаю. – Timo

Смежные вопросы