日期:2014-05-18  浏览次数:20943 次

streamReader 为什么要用循环来读取文件
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循环呢,不能一次过吗,怎么理解这个

------解决方案--------------------
可以的,

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


------解决方案--------------------
全部读进内存效率不好
------解决方案--------------------
全部读进内存效率不好
===================
这个理解有问题吧。你一行一行的读总归也都要读入内存的。文件不大而且要讲效率的话,不如一次全部读进来。
------解决方案--------------------
ReadLine()方法使用更普遍一些,若是测试或知道读取的文件不大,则可使用ReadToEnd()一次都读出来
------解决方案--------------------
试想一下如果你的文件有1G,你能一次把它都读进来吗?
这是就是个缓冲的思想。
基实在SteamReader中是有默认缓冲区的
看一下StreamReader.Read (Char[], Int32, Int32) 在MSDN中的备注就清楚了:
使用 Read 方法时,较为高效的方法是使用与流的内部缓冲区大小一致的缓冲区,其中内部缓冲区设置为您想要的块大小,并始终读取小于此块大小的内容。如果构造流时未指定内部缓冲区大小,则缓冲区的默认大小为 4 KB(4096 字节)。

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


------解决方案--------------------
对于小的文件就用readtoend吧,比readline速度快很多.
------解决方案--------------------
也就是说你每次读取时,实际上是从这4 KB的缓冲区里面读取的,
读过后,流会自动向前走,从磁盘上读入新的数据进入这个缓冲区。 
=================
这个我不否认。但是ReadLine返回的string仍然是占资源的。从返回string对象的大小来看,ReadLine返回的对象的总大小和ReadToEnd返回的string是相当的。两种方法的差别并不是那么大。主要还是看你操作的是行还是整个文件。像正则匹配一类的应用,使用ReadToEnd更加普遍。
------解决方案--------------------
ReadLine返回的对象的总大小和ReadToEnd返回的string是相当的。两种方法的差别并不是那么大。
============================
不可能,你读个超过100M的多行文件试一试。别弄个就一行的100M文件来试。
------解决方案--------------------
这个我不否认。但是ReadLine返回的string仍然是占资源的。从返回string对象的大小来看,ReadLine返回的对象的总大小和 ReadToEnd返回的string是相当的。两种方法的差别并不是那么大。主要还是看你操作的是行还是整个文件。像正则匹配一类的应用,使用 ReadToEnd更加普遍。
--------------------
说实话...我坚决不信...