C# 流混淆,理解缓冲区

C# 流混淆,理解缓冲区,c#,C#,我正在用C#编写自己的XML和CSV解析器(为了好玩),在让流正常工作时遇到了一点麻烦。基本上,我想一个字符一个字符地加载文件,并以这种方式读取它。我通常会使用readline,但这对于我现在正在做的事情和我将来打算做的事情来说有点太简单了。它看起来确实有效,但它要么非常慢,要么在无限循环中工作。输出似乎正常,但需要一段时间 我在MSDN上读了很多书,试图理解流媒体,但我在理解当前流媒体的位置上遇到了困难 List<string> s = new List<string>

我正在用C#编写自己的XML和CSV解析器(为了好玩),在让流正常工作时遇到了一点麻烦。基本上,我想一个字符一个字符地加载文件,并以这种方式读取它。我通常会使用readline,但这对于我现在正在做的事情和我将来打算做的事情来说有点太简单了。它看起来确实有效,但它要么非常慢,要么在无限循环中工作。输出似乎正常,但需要一段时间

我在MSDN上读了很多书,试图理解流媒体,但我在理解当前流媒体的位置上遇到了困难

List<string> s = new List<string>();
StreamReader r = File.OpenText(f.FullName);
StreamWriter w = File.CreateText(@"C:\Users\XXXXX\Desktop\streamoutput.txt");
char[] buffer = new char[1024];
int count = 0;
string csvChunk = "";

while (r.Peek() >= 0) //Before end of file?
{
    r.Read(buffer, 0, buffer.length); //Attempting to load in 1024 characters

    foreach (char c in buffer)
    {
        if(c == ','){
            s.Add(csvChunk);
            csvChunk = "";
        }
        else
        {
            csvChunk += c;
            w.Write(c); //Write output to file (so I can see what is going on)
            count++;    //Number of chars done  
        }
    }
   Console.Clear();
   Console.WriteLine("Written " + count + " characters "); //Just to keep track of whats up

}
r.Close();
w.Close();
List s=新列表();
StreamReader r=File.OpenText(f.FullName);
StreamWriter w=File.CreateText(@“C:\Users\XXXXX\Desktop\streamoutput.txt”);
char[]buffer=新字符[1024];
整数计数=0;
字符串csvChunk=“”;
而(r.Peek()>=0)//在文件结束之前?
{
r、 读取(buffer,0,buffer.length);//尝试加载1024个字符
foreach(缓冲区中的字符c)
{
如果(c==','){
s、 添加(csvChunk);
csvChunk=“”;
}
其他的
{
csvChunk+=c;
w、 Write(c);//将输出写入文件(这样我就可以看到发生了什么)
count++;//已完成的字符数
}
}
Console.Clear();
Console.WriteLine(“writed”+count+“characters”);//只是为了跟踪发生了什么
}
r、 Close();
w、 Close();
如果您能澄清以下内容,我将不胜感激:

  • 为什么这种方法会如此缓慢
  • 在第二个循环中,是否自动从前一个位置读取+1024个字符

  • 当我到达流的末尾,它试图将1024个字符放入缓冲区时,会发生什么情况您应该阅读更多关于c#string的内容,它是不可变的。所以每次你做这样的事情

    csvChunk += c;
    
    创建新的字符串对象。。。对于输入文件中的每个字符


    首先,正如@Leff所说,您正在使用

    csvChunk += c;
    
    它在每个赋值上创建一个新的string对象,因为string是一个不可变的对象。 您可以改用StringBuilder。 另一个可能提高性能的方法是BufferedStream

    var bufStream = new BufferedStream(<your stream reader>, buffer.Length);
    
    关于你的第二个问题:
    第三:如果还有n个字节,并且n您建议如何构建字符串?我已经阅读了MSDN文档(非常有趣,谢谢),但它似乎没有提到任何好的替代品。@Sam有一个类叫做
    StringBuilder
    while(bufStream.Read(buffer, 0, buffer.Length) != 0) 
    {...}