I disagree. FileReader uses the system encoding; this is the proper way to read from a file using a specific encoding, in this case UTF8.
In fact, FileReader extends InputStreamReader; its constructors each call super(new FileInputStream(arg)) where arg is the argument to the constructor.