Flujos de E / S de Java; ¿Cuáles son las diferencias?

java.io tiene muchos diferentesI / O Streams (FileInputStream, FileOutputStream, FileReader, FileWriter, BufferedStreams, etc.) y estoy confundido al determinar las diferencias entre ellos. ¿Cuáles son algunos ejemplos donde se prefiere un tipo de flujo sobre otro, y cuáles son las diferencias reales entre ellos?