如下是C#针对网络流的, 如果是别的什么流的话貌似需要改改。
public static void streamBufferedCopy(Stream source, Stream target, long size, bool showstatus = true, int bufferSize = 4096)
{
byte[] buffer = new byte[bufferSize];
int currsize = 0;
long readSize = 0;
DateTime st = DateTime.Now;
double time_delta = 0;
while (size - readSize > 0)
{
currsize = source.Read(buffer, 0, bufferSize);
//target.BeginWrite(buffer, 0, currsize, null, null);
target.Write(buffer, 0, currsize);
readSize += currsize;
time_delta = DateTime.Now.Subtract(st).TotalSeconds;
if (showstatus)
{
if (time_delta > 0)
Console.Write('\r' + "[Downloader] {0}%, {1}KB/s{2}", readSize * 100 / size, (readSize / time_delta / 1024).ToString("0.000"), new string(' ', 10));
else
Console.Write('\r' + "[Downloader] {0}%, 0KB/s{1}", readSize * 100 / size, new string(' ', 10));
}
}
//if (size - readSize > 0)
//{
// int remainSize = (int)(size - readSize);
// currsize = source.Read(buffer, 0, remainSize);
// target.Write(buffer, 0, currsize);
// readSize += remainSize;
//}
if (showstatus)
{
time_delta = DateTime.Now.Subtract(st).TotalSeconds;
if (time_delta > 0)
Console.Write('\r' + "[Downloader] {0}%, {1}KB/s{2}\n", readSize * 100 / size, (readSize / time_delta / 1000).ToString("0.000"), new string(' ', 10));
else
Console.Write('\r' + "[Downloader] {0}%, 0KB/s{1}\n", readSize * 100 / size, new string(' ', 10));
}
target.Flush();
target.Close();
}
在某处发现其实有Stream.CopyTo, 看了看, 貌似是差不多实现的。

发表评论