hm. we may need to implement GatheringByteChannel