 <blockquote> <p>Does it make sense to <em>always</em> wrap an InputStream as BufferedInputStream, when I know whether the given InputStream is something other than buffered?</p> </blockquote> <p>No.</p> <p>It makes sense if you are likely to perform lots of small reads (one byte or a few bytes at a time), or if you want to use some of the higher level functionality offered by the buffered APIs; for example the <code>BufferedReader.readLine()</code> method.</p> <p>However, if you are only going to perform large block reads using the <code>read(byte[])</code> and / or <code>read(byte[], int, int)</code> methods, wrapping the <code>InputStream</code> in a <code>BufferedInputStream</code> does not help. </p> <p>(In response to @Peter Tillman's comment on his own Answer, the block read use-cases definitely represent more than 0.1% of uses of <code>InputStream</code> classes!! However, he is correct in the sense that it is usually <em>harmless</em> to use a buffered API when you don't need to.)</p>