我要求串联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