gpt4 book ai didi

c# - TextReader.ReadToEnd 与 Stream.CopyTo

转载 作者:行者123 更新时间:2023-11-30 19:17:19 25 4
gpt4 key购买 nike

我有连接超过 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() 给我的印象是它会读到最后,将整个文本 block (在本例中为 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 将以 block 为单位进行复制(4096 = 默认大小),ReadToEnd 将在写入之前读取所有数据。因此,将使用 ReadToEnd() 方法完全读取 1gb 文件。所以对于大文件,我会建议 CopyTo。

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

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

关于c# - TextReader.ReadToEnd 与 Stream.CopyTo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18217047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com