Ну, вы могли бы прочитать символ за раз и проверить, соответствует ли он разделителю. Я считаю, что StreamReader
в любом случае сохраняет буфер, поэтому он не должен иметь больших затрат производительности (то есть он не будет попадать на диск каждый раз, когда вы читаете символ). Вы можете просто сохранить StringBuilder
«токена до сих пор» и продолжать идти, пока не достигнете разделителя, после чего вы вернете токен.
В качестве альтернативы, из соображений производительности, вы можете читать порцию за раз и сканировать массив символов в поисках разделителя, а затем построить строку, когда найдете ее. Поддерживать согласованное состояние будет значительно сложнее, чем просто использовать StringBuilder
и читать символ за раз, но если это критично для производительности, то это может стоить того.
Я бы не пытался эмулировать все того, что делает Scanner
- просто напишите нужные вам биты. Возможно, вы захотите реализовать это как IEnumerable<string>
с использованием блоков итераторов для удобства. Возможно, вы захотите передать Func<TextReader>
, а не сам TextReader
, чтобы блок итератора мог соответствующим образом закрыть читатель.