将一个流读入另一个流的最有效方法是什么?在这种情况下,我试图将 Filestream 中的数据读入通用流。我知道我可以执行以下操作:
1. 逐行读取并将数据写入流
2. 读取字节块并写入流
3. 等等
我只是想找到最有效的方法。
谢谢
Stephen Toub 在他的 MSDN .NET 问题专栏中讨论了流管道。在文章中,他描述了从一个输入流复制到另一个流的 CopyStream() 方法。这听起来与您尝试做的非常相似。
我汇总了一种快速扩展方法(仅适用于 VS 2008 w/3.5):
public static class StreamCopier
{
private const long DefaultStreamChunkSize = 0x1000;
public static void CopyTo(this Stream from, Stream to)
{
if (!from.CanRead || !to.CanWrite)
{
return;
}
var buffer = from.CanSeek
? new byte[from.Length]
: new byte[DefaultStreamChunkSize];
int read;
while ((read = from.Read(buffer, 0, buffer.Length)) > 0)
{
to.Write(buffer, 0, read);
}
}
}
它可以这样使用:
using (var input = File.OpenRead(@"C:\wrnpc12.txt"))
using (var output = File.OpenWrite(@"C:\wrnpc12.bak"))
{
input.CopyTo(output);
}
您还可以稍微交换逻辑并编写一个CopyFrom()
方法。
读取字节缓冲区然后写入它是最快的。像这样的方法ReadLine()
需要寻找行分隔符,这比仅仅填充缓冲区需要更多的时间。
我假设通用流是指任何其他类型的流,例如内存流等。
如果是这样,最有效的方法是读取字节块并将它们写入接收流。块大小可以是 512 字节。