我仍然不清楚 .NET 中 Streams 的概念
文件流例如:
using (FileStream fs = File.Open(C:\temp\Test.txt, FileMode.Open, FileAccess.Write, FileShare.None))
Run Code Online (Sandbox Code Playgroud)
上面的代码给我一个 FileStrem 对象。如果我的理解是正确的,我得到的 FileStream 对象是文件 C:\temp\Test.txt 的字节表示形式
我的问题:是否有对文件 C:\temp\Test.txt 的物理引用。
FileStream 只是底层文件字节表示的抽象吗?如果是,那么我可以传递这个 FileStream 对象来表示驻留在其他 Windows 计算机上的 Web 服务吗?
还有什么时候适合使用流。考虑一个场景,我需要从某个远程目录读取文件并将其通过 SFTP 传输到某个位置。在这里创建 FIleStream 有意义吗?
该Stream类型从根本上来说是 I/O 操作的包装器。这就是它的目的。有时会发生一些奇特的缓存,并且肯定有诸如MemoryStreams 之类的东西不与任何外部对象通信,但本质上,理论是流是您与这些对象通信的方式。
MSDN 有一个继承自 .NET Framework 类型的列表Stream,该列表有点太长,不值得在这里包含,但您会注意到,对于大多数类型来说,目标是从外部读取或写入源,或在其他流执行这些操作时实时处理它们。
重要的是要记住,不,流不仅仅是字节数组。字节数组恰好是从流中读取数据的一种非常好的方法。网络流就是一个很好的例子。如果不通过任何方式打开缓存,您就无法人为地在流中前后移动 - 您读取数据,仅此而已。
文件流可以让你跳来跳去,因为磁盘就在你的下面来做这种事情,但由于网卡本身不做缓存,网络就不能。
因此,不,您不能将流直接传递到 Web 服务。本质上,在大多数情况下,流只是指向某些 I/O 操作的指针(实际上是驱动程序)的包装器。如果系统甚至支持它(但它并不通过任何简单的方式实现),仅发送流就像通过电子邮件向某人发送指向 C:\ 驱动器上的文件的链接一样。
然而,您可以做的是将数据从一个流复制到另一个流。例如,您可以将数据从 a 复制FileStream到 a NetworkStream,从而允许您将文件传输到 Web 服务。数据将在传输过程中被系统缓冲,基本上从一个流中读取并直接写入另一个流。
为了更好地理解实时数据的概念,请看一个示例。想象一下您正在从磁盘读取数据。这在硬盘驱动器的工作方式上发生了一些不可接受或不准确的飞跃,但为了举例,它很简单:从文件的开头开始,读取 200 个字节。硬盘驱动器读取这 200 个字节,然后停止。然后您再请求 100 个字节。磁盘旋转,然后停止。这里最值得注意的是,磁盘不会读取所有文件,然后将其传递给您。如果它做到了,那么是的,字节数组将是一个更好的使用它的工具。
这里真正的目标是内存中保存的内容。使用流,您可以在内存中处理大量数据(实际上是无限的),而无需首先将所有数据直接拉入内存。您可以逐块阅读。
我不知道您对 LINQ 或IEnumerables 一般有多熟悉,但这里的理论是相同的 - 在 LINQ 中,直到您调用 someToArray()或ToList(),您的可枚举都不会被处理。它处于延迟执行状态,等待您使用它。在大多数情况下,流也是如此工作的。
| 归档时间: |
|
| 查看次数: |
835 次 |
| 最近记录: |