streamReader 为什么要用循环来读取文件

liujianliang 2007-12-31 11:18:36
using System;
using System.IO;
public class TextFromFile
{
private const string FILE_NAME = "MyFile.txt";
public static void Main(String[] args)
{
if (!File.Exists(FILE_NAME))
{
Console.WriteLine("{0} does not exist.", FILE_NAME);
return;
}
using (StreamReader sr = File.OpenText(FILE_NAME))
{
String input;
while ((input=sr.ReadLine())!=null)
{
Console.WriteLine(input);
}
Console.WriteLine ("The end of the stream has been reached.");
sr.Close();
}
}
为什么要用while循环呢,不能一次过吗,怎么理解这个
...全文
482 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
vrhero 2008-01-02
  • 打赏
  • 举报
回复
这个我不否认。但是ReadLine返回的string仍然是占资源的。从返回string对象的大小来看,ReadLine返回的对象的总大小和 ReadToEnd返回的string是相当的。两种方法的差别并不是那么大。主要还是看你操作的是行还是整个文件。像正则匹配一类的应用,使用 ReadToEnd更加普遍。
--------------------
说实话...我坚决不信...
binsweet 2008-01-02
  • 打赏
  • 举报
回复
是的,受分配缓冲区大小的影响。如果构造流时未指定缓冲区大小,则缓冲区的默认大小为 4 KB(4096 字节)。
river_a 2008-01-02
  • 打赏
  • 举报
回复
ReadLine返回的对象的总大小和ReadToEnd返回的string是相当的。两种方法的差别并不是那么大。
============================
不可能,你读个超过100M的多行文件试一试。别弄个就一行的100M文件来试。
lextm 2008-01-01
  • 打赏
  • 举报
回复
也就是说你每次读取时,实际上是从这4 KB的缓冲区里面读取的,
读过后,流会自动向前走,从磁盘上读入新的数据进入这个缓冲区。
=================
这个我不否认。但是ReadLine返回的string仍然是占资源的。从返回string对象的大小来看,ReadLine返回的对象的总大小和ReadToEnd返回的string是相当的。两种方法的差别并不是那么大。主要还是看你操作的是行还是整个文件。像正则匹配一类的应用,使用ReadToEnd更加普遍。
changjiangzhibin 2007-12-31
  • 打赏
  • 举报
回复
ReadLine()方法使用更普遍一些,若是测试或知道读取的文件不大,则可使用ReadToEnd()一次都读出来
lextm 2007-12-31
  • 打赏
  • 举报
回复
全部读进内存效率不好
===================
这个理解有问题吧。你一行一行的读总归也都要读入内存的。文件不大而且要讲效率的话,不如一次全部读进来。
fuadam 2007-12-31
  • 打赏
  • 举报
回复
全部读进内存效率不好
lsj_zrp 2007-12-31
  • 打赏
  • 举报
回复
sr.ReadLine()
是读取一行,所以需要循环
苏良辰 2007-12-31
  • 打赏
  • 举报
回复
可以的,

你可以用
sr.ReadToEnd() 这个函数
是读取全部的

ggw 2007-12-31
  • 打赏
  • 举报
回复
自己控制呗!
zlin_king 2007-12-31
  • 打赏
  • 举报
回复
对于小的文件就用readtoend吧,比readline速度快很多.
onthebox 2007-12-31
  • 打赏
  • 举报
回复
ReadLine()真的很有用
C++要是有这个就好了
jimgreat 2007-12-31
  • 打赏
  • 举报
回复
试想一下如果你的文件有1G,你能一次把它都读进来吗?
这是就是个缓冲的思想。
基实在SteamReader中是有默认缓冲区的
看一下StreamReader.Read (Char[], Int32, Int32) 在MSDN中的备注就清楚了:
使用 Read 方法时,较为高效的方法是使用与流的内部缓冲区大小一致的缓冲区,其中内部缓冲区设置为您想要的块大小,并始终读取小于此块大小的内容。如果构造流时未指定内部缓冲区大小,则缓冲区的默认大小为 4 KB(4096 字节)。

也就是说你每次读取时,实际上是从这4 KB的缓冲区里面读取的,
读过后,流会自动向前走,从磁盘上读入新的数据进入这个缓冲区。

哈哈潜伏哥 2007-12-31
  • 打赏
  • 举报
回复
学习了,不过我建议用readline()方法。
…… 2.asp.net代码:   //---------------------读html模板页面到stringbuilder对象里----   string[] format=new string[4];//定义和htmlyem标记数目一致的数组   StringBuilder htmltext=new StringBuilder();   try   {    using (StreamReader sr = new StreamReader("存放模板页面的路径和页面名"))    {   String line;   while ((line = sr.ReadLine()) != null)   {    htmltext.Append(line);   }   sr.Close();    }   }   catch   {    Response.Write("<Script>alert('读取文件错误')</Script>");   }   //---------------------给标记数组赋值------------   format[0]="background="bg.jpg"";//背景图片   format[1]= "#990099";//字体颜色   format[2]="150px";//字体大小   format[3]= "<marquee>生成的模板html页面</marquee>";//文字说明   //----------替换htm里的标记为你想加的内容   for(int i=0;i<4;i )   {    htmltext.Replace("$htmlformat[" i "]",format[i]);   }   //----------生成htm文件------------------――   try   {    using(StreamWriter sw=new StreamWriter("存放路径和页面名",false,System.Text.Encoding.GetEncoding("GB2312")))   {    sw.WriteLine(htmltext);    sw.Flush();    sw.Close();   }   }   catch   {   Response.Write ("The file could not be wirte:");   }   小结   用此方法可以方便的生成html文件。程序使用了是循环替换,因此对需替换大量元素的模板速度非常快。
计算机基础与程序设计知识点全文共9页,当前为第1页。计算机基础与程序设计知识点全文共9页,当前为第1页。计算机内部储存、处理、加工和传输汉字时使用的是汉字机内码. 计算机基础与程序设计知识点全文共9页,当前为第1页。 计算机基础与程序设计知识点全文共9页,当前为第1页。 Cache是为了解决CPU与储存器速度不匹配的问题. 蠕虫病毒是对计算机软件系统造成极大危害,他是一段特制的程序. 在C#中可以标识不同控件的属性是Name. 在C#中不能作为变量名的是long. 关于变量的声明和初始化,语句正确的是double x=13 不属于C#循环的中断语句的是jump语句. 设数组定义为:int[,]a=new int[5,6];,则下列数组元素的引用正确的是a[0,0] 在C#中,不会显示在窗体上的控件是ImageList 如果每隔15S产生一个定时器事件,则Timer的Interval属性应设置为15000 在C#中,如果不希望类被继承,则定义类时要使用关键字sealed 如果某个类程序员属于整个类而不属于类的某一个具体实例,则该程序员前需用修饰符static 在C#中,对文本文件进行读取通常使用StreamReader类 SQL Server 2008实一个关系模型数据库. 在ADO.NET中,用于对数数据源执行SQL命令语句的对象是Command对象. 下列软件工具中,不属于软件开发工具的是 版本控制工具. 主要用于面向对象的开发过程的模型是喷泉模型. 在数据流图中,用圆或圆角矩形表示 加工. 为了提高模块的独立性,模块之间最好是数据耦合. 在微型计算机中,西文字符一般采用 ASCII 码进行编码. 文件型病毒通常寄生在可执行文件中. C#程序的入口函数是Main 函数. 在C#中.注释有两种方法,其中/* */可以进行多行注释. 已知数组mun的定义为:int[]num=new int[5]{5,4,3,2,1};,则num.Length=5 计算机基础与程序设计知识点全文共9页,当前为第2页。计算机基础与程序设计知识点全文共9页,当前为第2页。已知某类的类名Studend,则该类的析构函数名为~Student 计算机基础与程序设计知识点全文共9页,当前为第2页。 计算机基础与程序设计知识点全文共9页,当前为第2页。 .NET绘图时,默认的坐标原点在窗体和控件的 左上 角. 删除名为student表的SQL语句是 DROPTABLE student 软件工程的3个要素是:方法、过程和工具. 基本路径测试属于软件动态测试中的白盒测试技术. 汉字字库中存放的是汉字字形码 属于输出设备的是绘图仪 计算机配置的内存的容量为4GB,其中的4GB是指4×1024×1024×1024B 在Visual Studio.net的集成开发环境中,默认情况下不支持的设计程序语言的Visual Basic 在C#中,不能作为变量名的是char 在C#中,将字符串'He said〞Hello!〞'保存到string变量中,正确的是str=〞He said〞Hello!〞'; 循环体至少执行一次的是do...while循环. 有定义语句:int[,]a=new int[5,6]; 引用正确的是a[3,4] 设数组a的定义为:int[]a=new int[3];,则a所占的存储空间的字节数是12字节 在windows窗体应用程序中,为了将菜单项File中的字符'F'设为助记符〔按Alt+能打开File菜单〕,应将该菜单项的Text属性设置为&File 在Windows窗体应用中,引用列表框ListBox1当前被选中的数据项的语句是ListBox1.Items[ListBox1.Selectedindex] 在C#中,类成员如果不带访问修饰符,则默认的修饰符为private 说法对的是构造函数的名字必须与类名相同. 属于static类的是File类 SQL是标准化的结构化查询语言 ADO.NET的两个主要的核心是.NET Franework数据提供程序和DataSet 在计算机软件的开发和维护过程中遇到一系列严重问题,这种现象被称为软件危机 在下列软件生命周期模型中,具有风险分析的是螺旋模型 计算机基础与程序设计知识点全文共9页,当前为第3页。计算机基础与程序设计知识点全文共9页,当前为第3页。用作软件需求分析工具的是数据流图 计算机基础与程序设计知识点全文共9页,当前为第3页。 计算机基础与程序设计知识点全文共9页,当前为第3页。 软件测试的目的是尽可能的发现软件系统中的错误. 一个字节是由8个二进制位组成的. 7位版本的ASCII码可表示的字符个数为128. C#程序中,定义命名空间的关键字是namespace 每个枚举成员均具有相关联的常量值,默认

110,569

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧