It is not that simple. The most efficient stream depends on what your requirements are. If you need to process character data, a byte stream may get the data faster but you still need to translate bytes into characters, which makes the difference moot. One should also consider speed of development and ease of maintainance. Why should I code something to translate bytes into characters when there's a class that does it already? The book Java Platform Performance descibes strategies for measuring performance and the basics on writing efficient Java code. The most important step is the first one, defining your requirements so you know what "efficient" is for your circumstances.