我可以让StreamReader“相信”EOL现在是“###”而不是“\ n”吗?

时间:2010-07-28 13:15:36

标签: c#

我有一个文件,我需要逐行阅读。 每行以“###”结尾,而不是以常规行尾字符(\ n)结尾。

有没有办法更改streamReader所以当我使用ReadLine()时它会读取,直到它看到“###”? 如果没有,是否有其他方法可以做到这一点,还是应该为此目的实现一个新类?

5 个答案:

答案 0 :(得分:2)

不,您不能使用StreamReader执行此操作。 StreamReader类是硬编码的,用于识别\r\n个字符,但不可配置。你可以使用.NET Reflector看到这个:

char ch = this.charBuffer[charPos];
switch (ch)
{
    case '\r':
    case '\n':
        string str;
        if (builder != null)
        // ...

如果您的文件不是太大,您可以将整个文件读入内存,然后在###上拆分。如果您需要流式传输行为,那么您可以自己编写类似于ReadLine的内容,但是可以使用您想要的行为。

答案 1 :(得分:0)

[笑话] 使用Moles框架,您可以更改Environment.NewLine的值

      MEnvironemnt.NewLineGet = () => "###"; 

并希望streamreader使用它 [/笑话]

但我想它更容易从streamreader继承并覆盖一个方法......

答案 2 :(得分:0)

行结束行为在StreamReader.ReadLine中进行了硬编码。

如果你想覆盖它或至少看看它是如何工作的,你可以制作自己的TextReader,不要忘记你可以从MS获得框架源(http://referencesource.microsoft.com/netframework.aspx

答案 3 :(得分:0)

我可以通过两种方式来做到这一点。 第一种是在StreamReader上编写一个扩展方法,它可以执行您想要的操作并使用它。 第二个是定义一个新的Encoding对象,它将###转换为\ n(并可能将\ n转换为其他内容)。

答案 4 :(得分:0)

一个选项(取决于性能问题)是做一个简单的read()并在输入流中查找“###”以随意执行任何操作。