如何在C#stream中模拟Java Scanner next()方法?

时间:2011-05-28 10:24:46

标签: c# .net string stream io

Java Scanner有一个next()方法,它从流中读取下一个标记,其中标记是由分隔符分隔的(默认情况下,分隔符是任何空格字符,包括制表符和换行符)。

如何使用C#/ .NET执行此操作? C#中的流有Read()ReadLine(),但它们没有空格或自定义分隔符的概念。我可以读取整行,然后使用字符串的Split()方法,但这意味着我必须首先读取整个字符串(而不是只读取下一个标记的next())。

1 个答案:

答案 0 :(得分:4)

好吧,你可以一次读取一个字符,并检查它是否与分隔符匹配。我相信StreamReader无论如何都会保留一个缓冲区,所以它不应该有太多的性能成本(即每次读取一个字符时都不会碰到磁盘)。您可以保留StringBuilder“令牌到目前为止”并继续前进,直到您点击分隔符,此时您将返回令牌。

或者,出于性能原因,您可以一次读取一个块,并扫描查找分隔符的字符数组,然后在找到它时构建字符串。保持状态一致将比使用StringBuilder并一次读取一个字符要复杂得多,但如果这对性能至关重要,那么它可能是值得的。

我不会尝试模拟Scanner所做的所有 - 只需编写您需要的位。为方便起见,您可能需要考虑使用迭代器块将其实现为IEnumerable<string>。您可能希望传入Func<TextReader>而不是TextReader本身,以便迭代器块可以正确关闭阅读器。