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

时间:2009-06-18 02:57:39

标签: c# .net-3.5 io .net

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

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

  

TextWriter类

     

表示可以编写的作者   连续的字符系列。这个   类是抽象的。

     

FileStream类

     

在文件周围显示一个流,   支持同步和   异步读写   操作

     

StreamWriter类

     

实现TextWriter以进行编写   字符到特定的流   编码

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

任何评论都会非常感激,非常感谢!

5 个答案:

答案 0 :(得分:57)

Streams处理 bytes ,Writers处理字符

字节!=字符。字符可能需要多个字节来表示。从字符到字节的映射称为 encoding

FileStream指的是写入文件的字节,类似于MemoryStream指向写入内存缓冲区的字节的方式。为了将字符写入流,您需要将它们转换为字节串。这就是StreamWriter进场的地方。它需要一系列字符和一个编码,并将其转换为字节序列。

TextWriter是所有作家必须遵守的接口(井,抽象基类)。它具有基于字符的所有操作。字节的等价物是Stream抽象基类。

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

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

答案 1 :(得分:10)

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

您无法实例化TextWriter。这是抽象的。这告诉我它所服务的唯一真正目的是抽象。如果你编写一个将任何类型的编写器作为参数的函数,那么你很有可能只需要将TextWriter变得更加通用。

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

所以基本上,你得到一个流,所以你可以将它提供给StreamWriter(或Reader)。如果您正在编写文本,您可能不希望直接使用流,只需要使用字符数组而不是字符串。

FileStream可以方便地直接从File和FileInfo类中实例化,在我的用法中,这就是它们通常被实例化的方式。获取文件(我喜欢使用FileInfo)并调用OpenWrite()。将它传递给StreamWriter(这只是一种TextWriter),你就可以了。

概括:当你想弄清楚一个类时,试着看看你如何实例化它以及它可以做什么。这通常会清除很多。

答案 2 :(得分:6)

“Stream”和“Writer / Reader”之间存在明显差异。

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

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

对于您的特定示例,TextWriter是一个抽象类,它按顺序将字符写入流。它有几个实现(StreamWriter,StringWriter),它们在不同的上下文中很有用。你可以使用当时有意义的东西。但是,对于几个API,所需要的只是TextWriter,或称为“Write”或“WriteLine”的东西。如果您的编写器用于将内容放入字符串,某些任意内存或文件中,那么这些API就不是问题了。

答案 3 :(得分:4)

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

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

答案 4 :(得分:2)

Stream是一个抽象基类,表示一系列字节。

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

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

文本字符本身由字节组成,单个字符可以是多个字节,具体取决于编码。有一些标准类使用特定编码读取和写入不同来源的文本。

TextWriter是一个抽象基类,用于将文本字符写入目标。

  • StreamWriter将文本字符(转换为字节)写入字节流。
  • StringWriter将文本字符写入字符串(通过StringBuilder)。

TextReader是一个抽象基类,用于从源中读取文本字符。

  • StreamReader从字节流中读取文本字符(从字节转换而来)。
  • StringReader从字符串中读取文本字符。

StreamTextWriterTextReader都是抽象基类,因此它们从不直接使用,而是通过类似于上述实现的实现。但是,您将在方法定义中看到基类,以便可以使用不同的实现,包括必要时自定义的实现。抽象类与接口类似,但实际上可以定义方法的逻辑,可以重复使用,而不需要每个实现重复相同的基本代码。