前几天遇到一个面试题。大意是从给一个文件A读取数据,然后对读取到数据做某种处理,然后输出到文件B.
写的时候想当然就使用StreamReader.ReadLine这种。实际interviewer提醒要考虑文件很大的情况。可惜我也从未处理过大文件的情况,直接说不会。现在把问题记录如下。
对于StreamReader来说,本身大文件应该是不会引起new的时候问题,关键问题在于ReadLine时,如果是超长的一行,可能会引起溢出问题。
MSDN也标注了这个Exception:
OutOfMemory Exception: There is insufficient memory to allocate a buffer for the returned string.
所以读取的时候,如果无法确定大小,或者已知是大文件,应该使用Read(Char[], Int32, Int32)方法替代
Read(Char[], Int32, Int32): Reads a specified maximum of characters from the current stream into a buffer, beginning at the specified index. (Overrides TextReader.Read(Char[], Int32, Int32).)
即每次读取指定大小的内容。
第一个参数为buffer,用来存储读取的内容。
第二个参数为index,从stream的该出进行读取。
第三个参数为size,读取的char的数量。
对于java,使用FileInputStream也有类似的 方法
int read(byte[] b)
int read(byte[] b, int off, int len)
-
using (StreamReader sr = new StreamReader(path))
-
{
-
//This is an arbitrary size for this example.
-
char[] c = null;
-
-
while (sr.Peek() >= 0)
-
{
-
c = new char[5];
-
sr.Read(c, 0, c.Length);
-
//The output will look odd, because
-
//only five characters are read at a time.
-
Console.WriteLine(c);
-
}
-
}
阅读(1771) | 评论(0) | 转发(1) |