Use a CharacterBuffer in CharacterReader

Saves two large char[] allocations (round-tripping through string)