当前位置:  开发笔记 > 编程语言 > 正文

TextReader.ReadToEnd vs Stream.CopyTo

如何解决《TextReader.ReadToEndvsStream.CopyTo》经验,为你挑选了1个好方法。

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

Jeroen van L.. 7

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

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

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



1> Jeroen van L..:

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

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

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

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有