fromReader() avoids reading char by char by using a 4k buffer

This also removes the need for BufferedReader.

IOUtils.toString() would normally do this, in effect just like in my patch - but I did not want to add another dependency just for that.