Chyba bardziej trzeba porównać Scanner z BufferedReader, ponieważ FileReader czyta tylko plik binarnie. Przed chwilą sam zbadałem ten temat i na tej stronie masz ładnie to wyróżnione. W skrócie:
- Scanner może parsować input przez nextInt(), nextLong(), nextShort(), nextFloat(), nextDouble(), natomiast BufferedReader czyta tylko do Sting.
- BufferedReader ma większy bufor- może czytać większy String.
- Scanner może używać wyrażeń regularnych.
- BufferedReader wspiera wielowątkowość.
Od siebie dodam, że w java8 można czytać pliki tak:
String fileName = "c://lines.txt";
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
stream.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}