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更加普遍。
--------------------
说实话...我坚决不信...