Ein InputStreamReader liest Bytes von einem InputStream (File, String,...) und dekodiert sie in ein bestimmtes Charset (UTF-8, ASCII).
Den BufferedReader kann man als Wrapper rund um den InputStreamReader verwenden. Bei einem read() kommen die Bytes dann nicht direkt vom Stream (was beim Lesen aus einem File sehr aufwändig sei kann) sondern aus dem Buffer des BufferedReaders. Das ist viel effizienter.