最近笔者在写一个小程序的时候,遇到一个问题,相信这个问题很多朋友碰到了,即在使用系统提供的方法System.IO.StreamReader.ReadLine()时,遇到“OutOfMemoryException ”问题。 因需求目标就是逐行读取txt文件,然后进行数据解析,第一次碰到该问题还真是一脸懵逼。
经过实际测试,在读取几百兆字节以内的txt文件时,System.IO.StreamReader.ReadLine()方法为首选,但是当txt文件超过1GB后,大概率会出“OutOfMemoryException ”问题。此外该方法在读取的时候占用内存极高,笔者在使用该方法读取一个1.3GB的txt文件时,占用内存最高达2.7GB,最后报告“OutOfMemoryException ”问题。
关于该问题,微软的帮助文档是这样解释的:
如果当前方法引发,则 OutOfMemoryException 读取器在基础字符串中的位置将由该方法可以读取的字符数提前,但已读入内部缓冲区的字符将被 ReadLine 丢弃。 由于不能更改读取器在字符串中的位置,因此,已读取的字符不可恢复,只能通过重新初始化来访问 StringReader 。 若要避免这种情况,请使用 Read 方法并在预分配的缓冲区中存储读取字符。
写的这是个什么玩意?让初学编程的笔者属实难以理解! 经过琢磨,笔者使用了StreamReader.Read()方法,重写了一个类,实现了逐行读取txt文件的功能,具体实现如下:
先定义一个类:
//定义类开始
class ReadTxtFileLine
{
//本类用于使用StreamReader.Read()方法,实现逐行读取文本文件,
int _IsReadEnd = 0; //文件读取的状态,当为false时,代表未读完最后一行,true为读完了最后一行
System.IO.StreamReader sr1;
int _LoopRowNumNow = 0;
//定义了一个是否读到最后的属性,数据类型为整数
public int IsReadEnd {
get => _IsReadEnd<

最低0.47元/天 解锁文章
477

被折叠的 条评论
为什么被折叠?



