Testing for empty InputStream in Java

lisak picture lisak · Mar 31, 2011 · Viewed 18.6k times · Source

how do you guys test for an empty InputStream? I know that InputStream is designed to work with remote resources, so you can't know if it's there until you actually read from it. I cannot use read() because current position would change and using mark() and resetting for that seems to be inappropriate.

The problem is, that sometimes one can't test if read() returns -1, because if you have a stream and some third party library uses it, you need to test if it is empty before you send it there.

By empty InputStreams I mean these new ByteArrayInputStream(new byte[0])

Answer

Leonel picture Leonel · Mar 31, 2011

You can wrap your InputStream in a PushbackInputStream. This class will store the first few bytes from read() in an internal buffer. You can later unread() the bytes and pass the object to the 3rd party library.

I don't really like ByteArrayInputStream, because it keeps all the data from the stream in memory.

Also, in any case, you will be forced to read() to check for the empty stream, which means you'll hit the network, at least for a few bytes.