I/O系统从某种意义上来说可分为两大类,一是控制台,而是文件系统,包含显示器,硬盘等。在C#中是通过数据流的方式来进行I/O操作的。什么是数据流呢?数据流是一种对产生和使用信息的抽象。在C#中,I/O操作的最小单位是字节,因为大多数设备在进行I/O操作时都是基于字节的。而对于人来说,我们常常习惯于使用字符来进行通信。C#中含有两种基本数据流,即字节数据流和字符数据流,同时也提供了一些类用于两者之间的转换。
.NET Framework中定义了字节数据流类和字符数据流类,而所有的核心数据流类都是在System.IO名称空间中,如果需要使用这些类需要使用下面的语句,
using System.IO
由于Console类定义在System名称空间中,所以不需要为控制台的输入输出指定System.IO名称空间。
(一)数据流类
C#中的核心数据流类是System.IO.Stream,Stream类是所有数据流类的基类,它是一个抽象类,不能实例化。下面介绍一下其包含的常用的方法和常用属性。
方法 | 说明 |
void Close() | 关闭数据流 |
void Flush() | 向物理设备写入数据流中的内容 |
int ReadByte() | 返回输入数据流中的下一个可用字节的整数表示,到达文件末尾时返回-1 |
int Read(byte[] buffer,int offset,int count) | 试着读取count个字节,并从buffer[offset]开始将数据写入buffer数组,返回成功读取的字节数 |
long Seek(long offset,SeekOrigin origin) | 在数据流中将当前位置设定在origin+offset处,返回新的地址 |
void WriteByte(byte value) | 把单个字节输入数据流中 |
int Read(byte[] buffer,int offset,int count) | 把数组buffer中从buffer[offset]开始的count个字节写入输出流,返回写入的字节数 |
属性 | 说明 |
bool CanRead | 如果数据流可读,属性为真,只读属性 |
bool CanWrite | 如果数据流可写,属性为真,只读属性 |
bool CanSeek | 如果数据流支持位置请求,属性为真,只读属性 |
bool Position | 该属性提供数据流的当前位置,读写属性 |
bool Length | 该属性提供数据流的长度,读写属性 |
bool CanTimeout | 如果数据流支持超时操作,属性为真,只读属性 |
int ReadTimeout | 该属性指定读操作的超时时间,读写属性 |
int WriteTimeout | 该属性指定写操作的超时时间,读写属性 |
从Stream类派生出一些具体的字节数据流类,这些数据流类都定义在System.IO名称空间中,包括BufferedStream类,FileStream类,MemoryStream类和UnmanagedMemoryStream类。
要创建字符数据流,需要将字节数据流包装在一个C#字符数据流包装类中。字符数据流层次结构的最顶层是抽象类TextReader和TextWriter,所有的派生类都必须实现这两个抽象类所定义的方法。
TextReader类定义的输入方法有:
方法 | 说明 |
int Peek() | 从输入数据流中获取下一个字符,但是不移除该字符,如果没有可用字符,则返回-1 |
int Read() | 返回输入数据流中的下一个可用字符的整数形式,当到达数据流末端时返回-1 |
int Read(char[] buffer,int index,int count) | 尝试读取count个字符,并从buffer[index]开始将数据写入buffer数组,返回成功读取的字符个数 |
int ReadBlock(char[] buffer,int index,int count) | 尝试读取count个字符,并从buffer[index]开始将数据写入buffer数组,返回成功读取的字符个数 |
string ReadLine() | 读取下一行文本并将其作为字符串返回,如果试图在文本末尾进行读取,就返回null |
string ReadToEnd() | 读取数据流中从当前位置到结尾的所有字符,并将其作为字符串返回 |
TextWriter类定义了各种版本的Write函数和WriteLine函数。除了这些函数,TextWriter类还定义了Close()和Flush()函数。其中,Flush()函数用于将输出缓冲区中的数据写入物理介质中,而Close()函数用于关闭写入程序并释放资源。
TextReader和TextWriter类作为抽象类,由一些基于字符的数据流类来实现。这些数据流包括StreamReader,StreamWriter,StringReader和StringWriter。
除了上面介绍的字节数据流和字符数据流外,C#中还定义了一种二进制数据流,BinaryReader和BinaryWriter类,直接读写二进制数据。