An improvement could be made here: this method has the potential to cause out of memory errors.  If you read up to a certain size, you could feed this into the iteratee, and then read more when the iteratee is available, and so on.