我正在用C#编写自己的XML和CSV解析器(出于娱乐目的),让我的流正常工作有点麻烦。基本上,我想按char加载文件char并以这种方式读取它。我通常会做readline,但这对于我现在正在做的事情以及我将来打算做的事情来说太简单了。它似乎确实起作用,但是它确实很慢或处于无限循环中。输出似乎还可以,但是需要一段时间。
我已经在MSDN上进行了大量阅读,以尝试理解Streaming,但是在理解当前Stream位置时遇到了麻烦。
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();
如果您能澄清以下内容,我将不胜感激:
首先,正如@Leff所说,您正在使用
csvChunk += c;
这是在每个分配上创建一个新的字符串对象,因为该字符串是不可变的对象。您可以改用StringBuilder。可以改善您的性能的另一件事是BufferedStream。
var bufStream = new BufferedStream(<your stream reader>, buffer.Length);
另外,您不需要使用Peek方法进行检查,Read(...)方法将返回读取到数组中的字节总数,因此您的while语句将如下所示:
while(bufStream.Read(buffer, 0, buffer.Length) != 0)
{...}
关于你的第二个问题:是的第三个问题:如果还剩n个字节,并且n <buffer.Length,它将读取n个字节,将它们放入缓冲区数组,然后返回n
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句