FileReader is just a Reader which reads a file, using the platform-default encoding (urgh)
BufferedReader is a wrapper around another Reader, adding buffering and the ability to read a line at a time
Scanner reads from a variety of different sources, but is typically used for interactive input. Personally I find the API of Scanner to be pretty painful and obscure.
To read a text file, I would suggest using a FileInputStream wrapped in an InputStreamReader (so you can specify the encoding) and then wrapped in a BufferedReader for buffering and the ability to read a line at a time.