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循环呢,不能一次过吗,怎么理解这个
...全文
504 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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()方法。

111,093

社区成员

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

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

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