将流读取到另一个流中的最有效方法是什么?在这种情况下,我试图将文件流中的数据读入通用流。我知道我可以做到以下几点:按行
1.读线和数据写入流
2个字节的块读取和写入到流
3.等将FileStream中的数据读取到通用流中
我只是想找到最有效的方法。
谢谢
将流读取到另一个流中的最有效方法是什么?在这种情况下,我试图将文件流中的数据读入通用流。我知道我可以做到以下几点:按行
1.读线和数据写入流
2个字节的块读取和写入到流
3.等将FileStream中的数据读取到通用流中
我只是想找到最有效的方法。
谢谢
Stephen Toub在他的MSDN .NET事务栏here中讨论了流管道。在这篇文章中,他描述了从一个输入流复制到另一个流的CopyStream()方法。这听起来与你想要做的很相似。
我真的很喜欢那篇关于并行任务的文章,但是那个流副本本身就非常有用。但是,如果流确实支持Length属性(如果CanSeek为false,则为异常),缓冲区应该是输入流的长度,并在一次读取中完成。 – 2008-09-24 20:27:24
读取字节缓冲区,然后写入它是最快的。像ReadLine()
这样的方法需要查找行分隔符,这比填充缓冲区需要更多的时间。
我想通过通用流,你的意思是任何其他类型的流,就像一个内存流等
如果是的话,最有效的方法是要读取的字节块,并将其写入收件人流。块大小可以是512字节。
我卷在一起的快速扩展方法(因此VS 2008瓦特/ 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()
方法。
你高效的意思是什么?那是最快的,使用最少量的内存还是其他一些标准? – 2008-09-24 23:50:39