Timo Ernst
Timo Ernst

Reputation: 16003

Get the number of bytes of a file behind a Java InputStream

As the title says, I need to know how many bytes the file has that's "behind" an InputStream. I don't want to download all bytes and count (takes to long). I just need to know how many bytes the file has.

Like this:

int numberOfBytes = countBytes(inputStream);

So, I need an implementation for countBytes(InputStream inputStream)

Upvotes: 3

Views: 7656

Answers (2)

Mike Yockey
Mike Yockey

Reputation: 4593

Could you leverage skip() in some way to approximate the size of the file?

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
}

I'm sure too that you could make this loop smarter and avoid the inevitable IOException, but that's an exercise left to the reader.

Upvotes: 2

NPE
NPE

Reputation: 500893

Other than by consuming the entire stream and counting the bytes, you can't (there's no API for it).

There's the available() method, but it quite explicitly doesn't do what you're asking:

Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not.

If the InputStream is associated with a file (and not, say, a socket), perhaps you could use a different API to get its size?

Upvotes: 8

Related Questions