1:I/O 输入输出
输入对象I——————处理——————输入对象 O
标准IO |
输入对象:键盘 输出对像:显示器 数据在内存只中缓冲 |
文件IO |
输入:文件 输出:文件 内存:输入缓冲,输出缓冲 |
内存IO |
输入:内存 输出:内存 |
其它IO如:网络IO …… |
从OS、从程序的角度来看,所谓的输入对象,输出对象都看成是一个文件,键盘看成是一个输入文件,显示其看成是一个输出文件,这样可以以统一的概念来看输入与输出。
2:Stream 流
流(Stream)是一个抽象的概念。
计算机中的文件主要用于存放大量的数据,可以保存在各种辅助存储器中,常见的有磁盘(软盘和硬盘)、光盘(CDROM和DVD)及U盘。与内存中的数据不同,即使断电,保存在辅助存储器中的文件数据不会丢失。
文件本身由一个个的二进制数0和1组成,8个二进制位(bit)构成一个字节(Byte),字节是文件存储的最小单位。
不管文件中存储的是什么数据,计算机都可以把它看成是一个二进制的字节流。
对文件内容进行的所有操作,就体现在对这些二进制数据的读和写两个操作上。存储在文件中的二进制数据是有序的,从文件开始到结束,不能随意更改去次序,就像是一条小溪流中的水一样,是不可能倒流的。因此,在软件中,常把文件看成是一个数据的“小溪”,用“文件流(File Stream)”这个概念来代表。
Stream 是所有流的抽象基类。流是字节序列的抽象概念,例如文件、输入/输出设备、内部进程通信管道或者 TCP/IP 套接字。Stream 类及其派生类提供这些不同类型的输入和输出的一般视图,使程序员不必了解操作系统和基础设备的具体细节。
流,输入流,输出流 标准流,文件流,内存流,网络流
如:.NET中我们创建一个文件流对象时候,对象就会有个数据缓冲,还有文件句柄(指针,对应的是非托管资源,指明了流的输出或是输入对象,还有输出或是读取位置的指针,它会移动) 调用 流.Write(..)方法时候,先将数据写入数据缓冲区,然后在一定的机制下将缓冲中的数据写入输出对象,也可以调用Flush()方法将缓冲数据强制放入到输出对象,然后清空缓冲区内容。
(1)标准流 如:C++中 cout cin cerr clog .NET中的Console(它包括这四种对象)
cout:console output 标准输出流对象 cout<< ‘d’<<’f’ 向缓冲区中插入数据
cin : console input 标准输入流对象 cin>>a>>b 键盘输入数据后放入数据缓冲区,提取数据放入变量a b 提取数据有一定的规则
cout << ----Console..Write cout >>endl---Stream.Flush
(2)文件流
。文件流的操作主要就是读写和与读写有关的文件指针的一些操作
。如何来理解读写的位置呢?
写的时候可以这样理解:写的数据先放在数据缓冲中,缓冲数据写入文件是根据根据文件流设定的读写位置来将数据插入文件
(3)内存流
3 .NET 中的 流
(1).NET 中流的继承结构
System.Object
System.MarshalByRefObject
System.IO.Stream[以下是常见的]
System.IO.BufferedStream
System.IO.FileStream
System.IO.MemoryStream
System.Net.Sockets.NetworkStream
(2)建立在流基础上的流操作类型【流读写器】
BinaryReader : IDisposable
BinaryWriter : IDisposable
TextReader : MarshalByRefObject, IDisposable
TextWriter : MarshalByRefObject, IDisposable
StreamReader : TextReader
StreamWriter : TextWriter
StringReader : TextReader
StringWriter : TextWriter
说明:流对象 vs 流读写对象
>流对象本身包括一些基本的流操作方法,只支持字节的读写
>流读写对象,它可用特定的编码来读写,支持复杂的读写操作
>流读写对象也有自己的缓冲区
>原理:如 建立在FileStream上的BinaryWriter. 显然BinaryWriter包含FileStream对象的引用,当往BinaryWriter对象写入数据的时候,它在内部将数据缓冲在自己的缓冲区,当满时,BinaryWriter对象将数据写入FileStream,。
若显示关闭BinaryWriter时候,它会将自己的缓冲数据写入到FileStream对象,然后调用关联的FileStream对象的关闭,FileSream关闭时候,先要将数据写入输出端,然后调用Win32的closeHandler函数来释放非托管的资源。