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

Posted

技术标签:

【中文标题】如何在 C# 流中模拟 Java Scanner 的 next() 方法?【英文标题】:How to simulate Java Scanner's next() method in C# stream? 【发布时间】:2011-09-03 21:36:18 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于如何在 C# 流中模拟 Java Scanner 的 next() 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中从内存流中播放 MP3?

Java实例——从控制台接收输入的身份证号

java语言中的scanner是啥意思用来干嘛

使用 IPC C# 时如何有效地从管道流中读取

从 C# 中的 WebSocket 流中读取整个字符串 [重复]

如何在 C# 中模拟 Number.intBitsToFloat()?