流混乱,了解缓冲区

山姆

我正在用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();

如果您能澄清以下内容,我将不胜感激:

  • 为什么这种方法这么慢?
  • 在第二个循环中,是否会自动从前一个位置读取+ 1024个字符?
  • 当我到达流的末尾并在剩余<1024的情况下尝试将1024个字符放入缓冲区时,会发生什么情况?
内瓦尔切夫

首先,正如@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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

强制缓冲区溢出以了解

来自分类Dev

了解Audio Recorder的read()缓冲区

来自分类Dev

了解文件指针和缓冲区

来自分类Dev

线程安全的缓冲区包装流

来自分类Dev

流缓冲区(cin,getline等)

来自分类Dev

流缓冲区中的默认内容

来自分类Dev

流和缓冲区的关系?

来自分类Dev

sendto()+ recvfrom()缓冲区混乱数据报

来自分类Dev

堆栈地址不对应(试图了解缓冲区溢出)

来自分类Dev

更详细地了解缓冲区交换

来自分类Dev

了解C中const缓冲区和read()的用法

来自分类Dev

缓冲区通常比流处理更快吗?

来自分类Dev

是否可以将流同步转换为缓冲区?

来自分类Dev

如何使用流解析缓冲区中的行?

来自分类Dev

流缓冲区之间的数据块级复制

来自分类Dev

C ++-缓冲区和流都需要什么?

来自分类Dev

如何从内存缓冲区加载张量流图

来自分类Dev

与I / O中的流的缓冲区链接

来自分类Dev

如何从缓冲区返回文件流?

来自分类Dev

如何在流缓冲区C中添加参数

来自分类Dev

什么用作缓冲区流的定界符

来自分类Dev

如何使用puppeteer获取下载流(缓冲区)?

来自分类Dev

如何使用流解析缓冲区中的行?

来自分类Dev

从套接字转换(解析)Google协议缓冲区流

来自分类Dev

每个流的TCP套接字缓冲区

来自分类Dev

C ++-缓冲区和流都需要什么?

来自分类Dev

流缓冲区之间的数据块级复制

来自分类Dev

通过HTTP(通过FFmpeg)流OpenGL帧缓冲区

来自分类Dev

了解何时使用缓冲区在Java中处理文件以及何时不使用缓冲区