Получить количество байтов файла за Java InputStream - PullRequest
3 голосов
/ 14 декабря 2011

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

Как это:

int numberOfBytes = countBytes(inputStream);

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

Ответы [ 2 ]

8 голосов
/ 14 декабря 2011

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

Есть метод available(), но он явно не делает то, что выВы просите:

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

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

2 голосов
/ 14 декабря 2011

Не могли бы вы каким-то образом использовать 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, но это упражнение осталось для читателя.

...