C# IO 101:TextWriter、FileStream和StreamWriter之间的主要区别是什么?

C# IO 101:TextWriter、FileStream和StreamWriter之间的主要区别是什么?,c#,.net-3.5,io,.net,C#,.net 3.5,Io,.net,首先让我道歉,如果这个问题对你们当中经验丰富的程序员来说听起来可能有点业余,问题是我在工作中对此一直有很多争论,所以我真的想弄清楚这一点,这就是为什么我依赖stackoverflow社区一劳永逸地解决这个问题:) 因此,一方面,根据MSDN,我们有: 文本编写器类 表示可以编写 连续的字符序列。这 类是抽象的 文件流类 公开文件周围的流, 同时支持同步和 异步读写 行动 StreamWriter类 实现一个用于编写文本的文本编写器 将字符添加到特定流中 编码 另一方面,很明显,它们都属于Syst

首先让我道歉,如果这个问题对你们当中经验丰富的程序员来说听起来可能有点业余,问题是我在工作中对此一直有很多争论,所以我真的想弄清楚这一点,这就是为什么我依赖stackoverflow社区一劳永逸地解决这个问题:)

因此,一方面,根据MSDN,我们有:

文本编写器类

表示可以编写 连续的字符序列。这 类是抽象的

文件流类

公开文件周围的流, 同时支持同步和 异步读写 行动

StreamWriter类

实现一个用于编写文本的文本编写器 将字符添加到特定流中 编码

另一方面,很明显,它们都属于System.IO,但考虑到MSDN示例混合了其中的一些示例,我仍然没有达到非常理想的a-ha时刻

任何评论都将不胜感激,提前感谢

流处理字节,写入程序处理字符

字节!=人物。一个字符可能需要多个字节来表示。从字符到字节的映射称为编码

FileStream
是指写入文件的字节,类似于
MemoryStream
是指写入内存缓冲区的字节。为了将字符写入流,您需要将它们转换为字节字符串。这就是
StreamWriter
发挥作用的地方。它接受字符序列和编码,并将其转换为字节序列

TextWriter
是所有编写者都必须遵守的接口(抽象基类)。它具有基于字符的所有操作。字节的等价物是
抽象基类

事情也朝着相反的方向发展。有一个
TextReader
抽象基类,描述如何从某处读取字符;还有一个
StreamReader
,它允许您从提供编码的面向字节的流中读取字符,但这次使用相反的方式,在适当的情况下将任何多字节序列聚合为单个字符

流可以用于读取和写入,因为字节是I/O操作中使用的最低级别的项。

该类管理获取文件句柄并打开它以进行读取或写入以及其他文件系统功能。将二进制数据写入流,并将字符数据写入流。它们都可以使用FileStream对象将二进制或字符数据写入文件


TextWriter是StreamWriter从中继承的基类。A用于获取类型并使用其方法输出字符串。StreamWriter的TextWriter.Write方法实现将字符串或字符数据写入流。BinaryWriter不会继承TextWriter,因为它不会将字符数据写入流。

在“流”和“编写器/读取器”之间有明显的区别

流是字节级的表示,实际上是一个抽象概念,可以通过多种方式实现。例如,您有一个文件流和一个内存流。这两个都是字节流,但它们的存储方式不同

作者和读者为您提供了一种处理流、添加和提取数据的方法


对于您的特定示例,TextWriter是一个抽象类,它按顺序将字符写入流。它有几个实现(StreamWriter、StringWriter),它们在不同的上下文中非常有用。你可以使用当时有意义的任何一种。然而,对于一些API,只需要一个TextWriter,或者在其上调用“Write”或“WriteLine”。如果您的编写器用于将内容放入字符串、任意内存或文件中,那么这些API就不必担心了。

我总是发现最好的办法就是看看它们提供了什么方法以及如何构建它们。这几乎总是我在使用API时最关心的事情,如果不是唯一的话。我如何构建它,它能做什么

不能实例化TextWriter。这是抽象的。这告诉我,它的唯一真正用途是抽象。如果您编写的函数使用任何类型的writer作为参数,那么很有可能您只需要使用textwitter就可以实现更多功能

你可以实例化一个StreamWriter,它只做它所说的,它写入流。这意味着它需要一个流来完成任何真正的写作。一旦你有了这个流,你可以做各种各样的整洁的事情,比如一次写一整行,而不必像直接在流上那样处理单个字符(或者更确切地说是字节)

因此,基本上,您可以获得一个流,以便将其提供给StreamWriter(或Reader)。如果您正在编写文本,您可能不希望直接使用流,就像您不希望使用字符串而希望使用字符数组一样

FileStreams可以方便地直接从File和FileInfo类实例化,在我的使用中,它们通常是这样实例化的。获取一个文件(我喜欢使用FileInfo)并调用OpenWrite()。将它传递给StreamWriter(这只是一种文本编写器),您就可以开始了


泛化:当你想弄明白一个类时,试着看看你是如何实例化它的,它能做什么。这通常会清除很多

是表示一系列字节的抽象基类

  • MemoryStream
    是内存中的字节流,由数组支持

  • FileStream
    是文件中的字节流,通常由磁盘上的某个文件句柄支持<