【发布时间】:2014-02-12 11:10:55
【问题描述】:
我想逐块读取非常大的文件(4GBish)。
我目前正在尝试使用StreamReader 和Read() 读取方法。语法是:
sr.Read(char[] buffer, int index, int count)
因为 index 是 int,在我的情况下它会溢出。我应该改用什么?
【问题讨论】:
标签: c# streamreader
我想逐块读取非常大的文件(4GBish)。
我目前正在尝试使用StreamReader 和Read() 读取方法。语法是:
sr.Read(char[] buffer, int index, int count)
因为 index 是 int,在我的情况下它会溢出。我应该改用什么?
【问题讨论】:
标签: c# streamreader
索引是缓冲区的起始索引而不是文件指针的索引,通常为零。在每次 Read 调用中,您将读取等于 Read 方法的 count 参数的字符。 您不会一次读取所有文件,而是分块读取并使用该块。
开始写入的缓冲区索引,reference。
char[] c = null;
while (sr.Peek() >= 0)
{
c = new char[1024];
sr.Read(c, 0, c.Length);
//The output will look odd, because
//only five characters are read at a time.
Console.WriteLine(c);
}
上面的示例将准备好 1024 个字节并将写入控制台。您可以使用这些字节,例如使用TCP 连接将这些字节发送到其他应用程序。
当使用 Read 方法时,使用缓冲区更有效 与流的内部缓冲区大小相同,其中 内部缓冲区设置为您想要的块大小,并始终读取 小于块大小。如果内部缓冲区的大小是 构造流时未指定,其默认大小为 4 千字节(4096 字节),MSDN。
【讨论】:
您可以尝试更简单的 Read 版本,它不会对流进行分块,而是逐个字符地读取它。你必须自己实现分块,但它会给你更多的控制权,让你可以使用 Long 来代替。
http://msdn.microsoft.com/en-us/library/ath1fht8(v=vs.110).aspx
【讨论】: