我要求连接超过 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);
}
}
}