C# I/O系统

1、I/O系统从某种意义上来说可分为两大类,一是控制台,二是文件系统,包含显示器,硬盘等。在C#中是通过数据流的方式来进行I/O操作的。什么是数据流呢?数据流是一种对产生和使用信息的抽象。在C#中,I/O操作的最小单位是字节,因为大多数设备在进行I/O操作时都是基于字节的。而对于人来说,我们常常习惯于使用字符来进行通信。C#中含有两种基本数据流,即字节数据流和字符数据流,同时也提供了一些类用于两者之间的转换。

2、.NET Framework中定义了字节数据流类和字符数据流类,而所有的核心数据流类都是在System.IO名称空间中,如果需要使用这些类需要引用名称空间: using System.IO。由于Console类定义在System名称空间中,所以不需要为控制台的输入输出指定System.IO名称空间。


一、 数据流类:

1)C#中的核心数据流类是System.IO.Stream,Stream类是所有数据流类的基类,它是一个抽象类,不能实例化。下面介绍一下其包含的常用的方法和常用属性。

(1)方法:

方法说明
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个字节写入输出流,返回写入的字节数
(2)属性:
属性说明
bool CanRead如果数据流可读,属性为真,只读属性
bool CanWrite如果数据流可写,属性为真,只读属性
bool CanSeek如果数据流支持位置请求,属性为真,只读属性
bool Position该属性提供数据流的当前位置,读写属性
bool Length该属性提供数据流的长度,读写属性
bool CanTimeout如果数据流支持超时操作,属性为真,只读属性
int ReadTimeout该属性指定读操作的超时时间,读写属性
int WriteTimeout该属性指定写操作的超时时间,读写属性

1、从Stream类派生出一些具体的字节数据流类,这些数据流类都定义在System.IO名称空间中,包括BufferedStream类,FileStream类,MemoryStream类和UnmanagedMemoryStream类。

2、要创建字符数据流,需要将字节数据流包装在一个C#字符数据流包装类中。字符数据流层次结构的最顶层是抽象类TextReader和TextWriter,所有的派生类都必须实现这两个抽象类所定义的方法。


2)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()读取数据流中从当前位置到结尾的所有字符,并将其作为字符串返回

(1)TextWriter类定义了各种版本的Write函数和WriteLine函数。除了这些函数,TextWriter类还定义了Close()和Flush()函数。其中,Flush()函数用于将输出缓冲区中的数据写入物理介质中,而Close()函数用于关闭写入程序并释放资源。

(2)TextReader和TextWriter类作为抽象类,由一些基于字符的数据流类来实现。这些数据流包括StreamReader,StreamWriter,StringReader和StringWriter。

(3)除了上面介绍的字节数据流和字符数据流外,C#中还定义了一种二进制数据流,BinaryReader和BinaryWriter类,直接读写二进制数据。


以上转载自: http://blog.csdn.net/andamajing/article/details/7458983


以下转载自:http://blog.csdn.net/andamajing/article/details/7458993


控制台的I/O是通过标准的数据流Console.In,Console.Out,Console.Error实现的。

(一)、Console.In:

Console.In是TextReader类的一个实例,可以使用TextReader类定义的方法。但是,一般情况下,我们使用的是Console类提供的方法,共有三个方法,它们分别是Read(),ReadLine()和ReadKey()函数。

1)Read():

读取单个字符时通常使用Read()函数,它为静态函数,用于从控制台读取下一个字符,返回所读取字符的int类型的值,如果需要使用该字符,必须使用char关键字进行强制类型转换。该方法在调用失败时返回-1,并抛出IOException异常。

默认情况下,控制台输入都是逐行缓冲的,因此必须按下Enter键将输入的字符发送给程序。在按下Enter键时,系统会把一个包含回车键的换行序列放到输入数据流中,字符在被读取之前一直存储在输入缓冲区中。

2)ReadLine( ):

如果需要读取一个字符串,那么我们需要使用ReadLine()函数了,该函数一直读取字符并在用户按下Enter键时以String对象的形式返回这些字符。

3)ReadKey():

在.NET Framework 2.0以后,Console类增添了一个新的方法ReadKey(),该函数以非逐行缓冲的方式读取按键。

ReadKey()方法有两种形式,如下所示:

static ConsoleKeyInfo ReadKey();

static ConsoleKeyInfo ReadKey(bool intercept);

第一种形式将等待从键盘的输入,当用户按下某个按键时,立即返回该键,并在屏幕上显示相应的键。第二种形式也等待从键盘输入,当有键按下时立即返回该键,如果intercept为真,就不会显示该键,如果intercept为键,则屏幕上显示相应的键。

从上面的函数定义可以看到,该函数返回一个ConsoleKeyInfo对象,该对象时一个结构体,包含下面的只读属性:

char KeyChar

ConsoleKey Key

ConsoleModifiers Modifiers

其中:

(1):KeyChar属性包含了与所按下的键相匹配的char类型值。

(2):Key属性包含了一个ConsoleKey枚举定义的枚举值,ConsoleKey枚举定义了与键盘上所有按键相对应的键值。

(3):ConsoleModifiers枚举定义了键盘按键的修饰符,如Shift,Ctrl 和 Atl 。


(二)Consloe.Out:

Console.Out和Console.Error都是TextWriter类型的对象,虽然可以调用它定义的方法进行输出,但是由于Console类定义了自己的输出函数Write函数和WriteLine函数,所以可以直接调用它们。


(三)Console.Error:
Console.Error在默认情况下是输出写入到控制台,但是我们可以重定向到一个磁盘文件,而不是屏幕,将错误信息输出到日志文件中并且不影响控制台的输出。


另可参考:

http://blog.csdn.net/andamajing/article/details/7460515

http://blog.csdn.net/andamajing/article/details/7460642

http://blog.csdn.net/andamajing/article/details/7467048

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值