我要求串联500MB以上的文本文件。

给我的旧代码使用TextReader.ReadToEnd()和以下代码:

using (TextWriter textWriter = new StreamWriter(concatenatedFile, false, fEncoding))
{
    foreach (string filename in filesToConcatenate)
    {
        using (TextReader textReader = new StreamReader(filename, Encoding.Default))
        {
            textWriter.Write(textReader.ReadToEnd());
        }
    }
}


我想更改上面的代码以将Stream.CopyTo()与File.OpenRead一起使用。
为了证明更改的合理性,我可以想到一件事,当ReadToEnd()用于非常大的文件时,我遇到了OutofMemoryException。

ReadToEnd()给我一个印象,它将读到末尾,将整个文本块(在这种情况下为500MB)保存到内存中,然后写入指定的流。

所以我的问题是:
在超大文件串联中,Stream.CopyTo()与ReadToEnd()有何不同?每次Stream.CopyTo()复制到流中时,将如何确定文本的大小?在大多数情况下,使用它代替ReadToEnd()可以防止OutOfMemoryException吗?

这是我要使用的代码:

using (Stream output = System.IO.File.OpenWrite(outputFile))
{
    foreach (string inputFile in inputFiles)
    {
        using (Stream input = System.IO.File.OpenRead(inputFile))
        {
            input.CopyTo(output);
        }
    }
}

最佳答案

CopyTo将按块复制(4096 =默认大小),ReadToEnd将在写入之前读取所有数据。因此,将使用ReadToEnd()方法完全读取1gb文件。因此,对于大文件,我会建议CopyTo。

CopyTo有一个重载方法来指定块大小。

Stream.CopyTo方法(Stream,Int32)http://msdn.microsoft.com/en-us/library/dd783870.aspx

09-25 18:30