|
|
1
720
从。NET 4.5上,有
这将返回一个
请注意,这取决于呼叫的位置
这
此外,此调用(这是一个可能更改的实现细节)仍然会对读取和写入进行排序(它只是不会在I/O完成时浪费线程阻塞)。
从。NET 4.0上,有
为了。NET 3.5及之前版本 框架中没有任何东西可以帮助实现这一点;您必须手动复制内容,如下所示:
注1:此方法将允许您报告进度(到目前为止读取了x个字节…)
|
|
2
69
以及。NET 4.0已经
.NET 4.0:
|
|
|
3
32
我使用以下扩展方法。当一个流是MemoryStream时,他们优化了重载。
|
|
|
4
1
.NET Framework 4引入了系统流类的新“CopyTo”方法。IO命名空间。使用这种方法,我们可以将一个流复制到不同流类的另一个流。 这里有一个例子。
|
|
|
5
1
实际上,有一种不那么严厉的流拷贝方式。但是请注意,这意味着您可以将整个文件存储在内存中。如果您处理的文件大小达到或超过数百兆字节,请不要随意尝试使用此功能。
注意:二进制数据和字符编码也可能存在一些问题。 |
|
|
6
1
区分“CopyStream”实现的基本问题是:
这些问题的答案导致CopyStream的实现方式大不相同,并且取决于您拥有什么样的流以及您试图优化什么。“最佳”实现甚至需要知道流正在读取和写入哪些特定硬件。 |
|
|
7
0
不幸的是,没有真正简单的解决方案。你可以试试这样的东西:
但是,如果没有可读取的内容,Stream类的不同实现可能会有不同的行为。从本地硬盘驱动器读取文件的流可能会阻塞,直到读取操作从磁盘读取了足够的数据来填充缓冲区,并且只有在到达文件末尾时才会返回较少的数据。另一方面,即使还有更多数据要接收,从网络读取的流也可能返回更少的数据。 在使用通用解决方案之前,请务必检查您正在使用的特定流类的文档。 |
|
|
8
0
根据您使用的流类型,可能有一种更有效的方法来实现这一点。如果可以将一个或两个流转换为MemoryStream,则可以使用GetBuffer方法直接处理表示数据的字节数组。这允许您使用Array等方法。CopyTo,它抽象了fryguybob提出的所有问题。你可以信任。NET知道复制数据的最佳方式。 |
|
|
9
0
但如果它在运行时不使用过程,则应使用内存流
|
|
|
10
0
由于这些答案都没有涵盖从一个流复制到另一个流的异步方式,因此我在端口转发应用程序中成功地使用了一种模式,将数据从一个网络流复制到了另一个。它缺乏异常处理来强调模式。
|
|
|
11
0
为了。NET 3.5及试用前:
|
|
12
0
简单安全-从原始来源创建新流:
|
|
|
13
-3
以下代码用于解决此问题,使用CopyTo将流复制到MemoryStream
//任何函数都需要输入流。在mycase中将PDF文件保存为流 文件。保存(流式传输);
//注意-请在finally块中处理流,而不是在内部使用块,因为它会抛出错误“流关闭时拒绝访问” |