文件打开内存c#

时间:2010-01-16 14:50:11

标签: c#

使用流阅读器在C#中打开文件时,文件将保留在内存中直到关闭。 例如,如果程序使用streamreader打开大小为6MB的文件,则在文件末尾附加一行。程序是否将整个6 MB保留在内存中,直到文件关闭。 OR是.Net代码在内部返回的文件指针,并在末尾附加行。因此程序不会占用6MB内存

4 个答案:

答案 0 :(得分:5)

流的全部意义在于您不必将整个对象保存在内存中。你可以根据需要逐一阅读。

如果要附加到文件,则应使用File.AppendText,这将创建附加到文件末尾的StreamWriter

以下是一个例子:

 string path = @"c:\temp\MyTest.txt";

 // This text is always added, making the file longer over time
 // if it is not deleted.
 using (StreamWriter sw = File.AppendText(path)) 
 {
     sw.WriteLine("This");
     sw.WriteLine("is Extra");
     sw.WriteLine("Text");
 } 

同样,整个文件不会存储在内存中。

文档:http://msdn.microsoft.com/en-us/library/system.io.file.appendtext.aspx

答案 1 :(得分:2)

.NET FileStream将缓冲少量数据(您可以使用某些构造函数设置此数量)。

Windows操作系统将对文件进行更重要的缓存,如果您有足够的RAM,则可能是整个文件。

答案 2 :(得分:1)

StreamReader将将6 MB文件读入内存。此外,您不能使用StreamReader在文件末尾附加一行。您可能想要使用StreamWriter。

更新:不计算其他人提到的缓冲和操作系统缓存

答案 3 :(得分:1)

StreamReader使用FileStream打开文件。 FileStream存储由CreateFile()API函数返回的Windows句柄。它在32位操作系统上是4个字节。 FileStream也有一个byte []缓冲区,默认为4096字节。此缓冲区避免了必须为每个单个读取调用调用ReadFile()API函数。 StreamReader本身有一个小缓冲区,可以使文件中的文本解码效率更高,默认为128字节。它有一些私有变量来跟踪缓冲区索引以及是否检测到BOM。

这一切加起来只有几千字节。您使用StreamReader读取的数据当然会占用程序堆中的空间。如果将每个字符串存储在List中,那么这可能会增加12兆字节。你通常想避免这种情况。