for starters, streams are meant to access data as raw bytes whereas readers and writers can be used to access data at character level. As the name says, the BufferedInputStream allows buffered access to the bytes of an underlying stream. The FileReader allows reading of characters from a file. However, as Ernest Friedman-Hill stated this is just a small part of differences. The two classes are barely comparable.