gpt4 book ai didi

.net - Streams 及其在 .Net 中的用途

转载 作者:行者123 更新时间:2023-12-05 09:22:04 25 4
gpt4 key购买 nike

我对.NET中Streams的概念还不是很清楚

例如文件流:

using (FileStream fs = File.Open(C:\temp\Test.txt, FileMode.Open, FileAccess.Write, FileShare.None)) 

上面的代码为我获取了一个 FileStrem 对象。如果我的理解是正确的,我得到的 FileStream 对象是文件的字节表示C:\temp\Test.txt

我的问题:是否有对文件 C:\temp\Test.txt 的物理引用。

FileStream只是底层文件的字节表示的抽象吗。如果是,那么我可以传递这个 FileStream 对象来表示驻留在其他 Windows 机器上的 Web 服务。

还有什么时候适合使用流。考虑这样一种情况,我需要从某个远程目录读取文件并将其通过 SFTP 传输到某个位置。在这里创建一个 FIleStream 有意义吗?

最佳答案

Stream 类型从根本上说是 I/O 操作的包装器。这就是它的目的。有时会进行一些花哨的缓存,而且肯定有诸如 MemoryStream 之类的东西,它不与任何外部对象对话,但从本质上讲,理论上流是你与那些对话的方式对象。

MSDN has a list继承自 Stream 的 .NET Framework 类型,这太长了,不便包含在这里,但您会注意到,对于其中的大多数,目标是读取或写入来自或来自外部来源,或者在执行这些操作时实时处理其他流。

重要的是要记住,不,流只是一个字节数组。碰巧字节数组只是从流中读取数据的一种非常好的方式。网络流就是一个很好的例子。如果不通过任何方式打开缓存,您就无法在流中人为地后退或前进——您读取数据,仅此而已。

文件流可以让你跳来跳去,因为磁盘就在你身下做那种事,但由于 NIC 不自己做缓存,网络也不能。

因此,不,您不能将流直接传递给网络服务。本质上,在大多数情况下,流只是指向某些 I/O 操作的指针(实际上是驱动程序)的包装器。如果系统甚至支持它(它无法通过任何简单的方式支持),那么仅发送流就像通过电子邮件向某人发送指向您 C:\驱动器上的文件的链接。

但是,您可以将数据从一个流复制到另一个流。例如,您可以将数据从 FileStream 复制到 NetworkStream,从而允许您将文件传输到 Web 服务。数据在通过时会被系统缓冲,基本上是从一个流中读取并直接写入另一个流。

为了更好地理解实时数据的概念,请看一个示例。假设您正在从磁盘读取数据。这对硬盘驱动器的工作方式进行了一些 Not Acceptable 或不准确的飞跃,但为了举例,它很简单:您从文件的开头开始,读取 200 个字节。硬盘驱动器读取这 200 个字节,然后停止。然后您要求另外 100 个字节。磁盘旋转,然后停止。这里最值得注意的是,磁盘不会读取所有文件,然后将其传递给您。如果它这样做了,那么是的,字节数组将是一个更好的使用它的工具。

这里的真正目标是保存在内存中的内容。使用流,您可以在内存中处理大量 的数据,实际上是无限的,而不必一开始就将所有数据直接拉入内存。您可以逐 block 阅读它。

我不知道您对 LINQ 或 IEnumerable 一般有多熟悉,但这里的理论是相同的 — 在 LINQ 中,直到您调用一些 ToArray()ToList(),您的可枚举未被处理。它处于延迟执行状态,等待您使用它。在大多数情况下,这也是流的工作方式。

关于.net - Streams 及其在 .Net 中的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29130783/

25 4 0