第04章套接字与数据流

上传人:鲁** 文档编号:585665649 上传时间:2024-09-03 格式:PPT 页数:49 大小:429KB
返回 下载 相关 举报
第04章套接字与数据流_第1页
第1页 / 共49页
第04章套接字与数据流_第2页
第2页 / 共49页
第04章套接字与数据流_第3页
第3页 / 共49页
第04章套接字与数据流_第4页
第4页 / 共49页
第04章套接字与数据流_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《第04章套接字与数据流》由会员分享,可在线阅读,更多相关《第04章套接字与数据流(49页珍藏版)》请在金锄头文库上搜索。

1、1 1第第4章章 套接字与数据流套接字与数据流4.1 套接字套接字4.1.1 面向面向连接的套接字接的套接字 4.1.2 无无连接的套接字接的套接字4.2 数据流数据流4.2.1 文件流文件流4.2.2 内存流内存流4.2.3 网网络流流4.2.4 StreamWriter与与StreamReader类4.2.5 BinaryReader与与BinaryWriter类2 2本章教学目的本章教学目的学学习套接字套接字编程的基本方法,以及数据流相关程的基本方法,以及数据流相关类的用法。的用法。本章教学要求本章教学要求(1)掌握套接字的概念及)掌握套接字的概念及Socket类用法;用法;(2)掌握面

2、向)掌握面向连接套接字接套接字编程、无程、无连接套接字接套接字编程基本步程基本步骤(3)掌握)掌握FileStream、MemoryStream、NetworkStream类的用法;的用法;(4)掌握)掌握StreamReader、StreamWriter、BinaryReader、 BinaryWriter类的基本用法。的基本用法。本章重点本章重点3 34.1 套接字套接字一个一个连接由它的两个端点接由它的两个端点标识,这样的端点称的端点称为套接字。套接字。4 44.1 套接字(续套接字(续)套接字是支持套接字是支持TCP/IP协议的网的网络通信的基本操作通信的基本操作单元。可元。可以将套接

3、字看作以将套接字看作不同主机不同主机间的的进程程进行双向通信的端点行双向通信的端点。上上图连接接1的一的一对套接字套接字为: (192.168.2.23,5000)和()和(192.168.2.122,8888) 上上图连接接2的一的一对套接字套接字为: (192.168.2.23,5001)和()和(192.168.2.122,8888)对于于UDP协议尽管两个尽管两个进程之程之间没有建立没有建立连接,但是也同接,但是也同样存在存在发送端点,和接收端点,也同送端点,和接收端点,也同样使用套接字的概念。使用套接字的概念。5 54.1 套接字(续套接字(续)套接字的套接字的类型有:型有:1.流式

4、流式套接字:提供了面向套接字:提供了面向连接的、可靠的、数据无接的、可靠的、数据无错并且并且无重复的数据无重复的数据发送服送服务,而且接收数据的,而且接收数据的顺序和序和发送数据送数据的的顺序是相同的。序是相同的。 2.数据数据报套接字:提供了面向无套接字:提供了面向无连接的服接的服务,它以独立的数它以独立的数据包形式据包形式发送数据送数据(数据包数据包长度不能大于度不能大于32KB),不提供,不提供正确性正确性检查,也不保,也不保证各数据包的各数据包的发送送顺序和接收序和接收顺序相序相同同 ,因此,可能出,因此,可能出现数据的重数据的重发、丢失等失等现象。象。 3.原始原始套接字:用于直接套

5、接字:用于直接访问协议的的较低低层。常用于。常用于检验新新的的协议实现或或访问现有服有服务中配置的新中配置的新设备,一般不提倡,一般不提倡直接使用原始套接字。直接使用原始套接字。 6 64.1 套接字(续套接字(续)Socket类包含在包含在System.Net.Sockets命名空命名空间中。中。一个一个Socket实例包含了一个本地或者一个例包含了一个本地或者一个远程端点的套接程端点的套接字信息。字信息。使用使用Socket类编程,由于很多程,由于很多细节都需要自己考都需要自己考虑,相,相对来来说复复杂一些,易出一些,易出错。一般。一般对套接字套接字编程比程比较熟悉的人熟悉的人,或者使用非

6、,或者使用非标准准协议(自定(自定义的新的新协议)进行行编程的程的时候,才使用候,才使用Socket类。Socket类的构造函数的构造函数为: public Socket( AddressFamily addressFamily, /网网络类型型 SocketType socketType, /套接字套接字类型型 ProtocolType protocolType); /使用的使用的协议 7 74.1 套接字(续套接字(续)参数含参数含义:(1)addressFamily addressFamily表示网表示网络类型,型,该参数使用参数使用AddressFamily枚枚举指定指定Socket使

7、用的使用的寻址方案址方案例如例如AddressFamily.InterNetwork表示表示IP版本版本4的地址。的地址。8 84.1 套接字(续套接字(续)9 94.1 套接字(续套接字(续)(2)socketTypesocketTyp指定指定Socket的的类型,型,该参数使用参数使用SocketType枚枚举指定使用哪种套接字。例如指定使用哪种套接字。例如:SocketType.Stream表明表明连接是基于流套接字的接是基于流套接字的SocketType.Dgram表示表示连接是基于数据接是基于数据报套接字套接字SocketType.Raw表示表示连接基于原始套接字;接基于原始套接字;

8、 详细见课本表本表4-210104.1 套接字(续套接字(续)(3)protocolTypeprotocolType指定指定Socket使用的使用的协议,该参数使用参数使用ProtocolType枚枚举指定使用哪种指定使用哪种协议。例如。例如:uProtocolType.Tcp表明表明连接接协议是是TCPuProtocolType.Udp表明表明连接接协议是是UDPu详细见课本表本表4-311114.1 套接字(续套接字(续)Socket构造函数的三个参数中,对于网络上的构造函数的三个参数中,对于网络上的IP通信来说,通信来说,AddressFamily总是使用总是使用AddressFamil

9、y.InterNetwork枚举值。而枚举值。而SocketType参数则与参数则与ProtocolType参数配合使用,不允许其他的匹配参数配合使用,不允许其他的匹配形式,也不允许混淆匹配。下表列出了可用于形式,也不允许混淆匹配。下表列出了可用于IP通信的组合。通信的组合。 SocketTypeProtocolType说明说明DgramUdp无连接通信无连接通信StreamTcp面向连接的通信面向连接的通信RawIcmpInternet控制报文协议控制报文协议RawRaw简单简单IP包通信包通信12124.1.1 面向连接的套接字面向连接的套接字IP连接接领域有两种通信域有两种通信类型:型:

10、u面向面向连接的(接的(connection-oriented)u无无连接的(接的(connectionless)。)。根据根据连接启接启动的方式以及本地套接字要的方式以及本地套接字要连接的目接的目标,套接,套接字之字之间的的连接接过程可以分程可以分为三个步三个步骤:u服服务器器监听听u客客户端端请求求u连接确接确认13134.1.1 面向连接的套接字面向连接的套接字服服务器器监听:听:是指服是指服务器套接字并不定位具体的客器套接字并不定位具体的客户端套端套接字,而是接字,而是处于等待于等待连接的状接的状态,实时监控网控网络状状态。客客户端端请求:求:是指由客是指由客户端的套接字提出端的套接字

11、提出连接接请求,要求,要连接的目接的目标是服是服务器的套接字。器的套接字。为此,客此,客户端的套接字必端的套接字必须首先描述它要首先描述它要连接的服接的服务器的套接字,指出服器的套接字,指出服务器套接字器套接字的地址和端口号,然后再向服的地址和端口号,然后再向服务器套接字提出器套接字提出连接接请求。求。连接确接确认:是指当服是指当服务器套接字器套接字监听到客听到客户端套接字的端套接字的连接接请求求时,它就响,它就响应客客户端套接字的端套接字的请求,把服求,把服务器套接器套接字的信息字的信息发给客客户端,一旦客端,一旦客户端确端确认了此信息,了此信息,连接即接即可建立。而服可建立。而服务器套接字

12、器套接字继续监听其他客听其他客户端套接字的端套接字的连接接请求。求。14144.1.1 面向连接的套接字面向连接的套接字Socket()Bind()Listen()Accept()Receive()Send()Close()Socket()Connect()Send()Receive()Close()服务器端 客户端面向连接的套接字编程15154.1.1 面向连接的套接字面向连接的套接字同步同步TCP编写服写服务器端程序的一般步器端程序的一般步骤为: 1) 创建一个包含采用的网建一个包含采用的网络类型、数据型、数据传输类型和型和协议类型型的本地套接字的本地套接字对象,并将其与服象,并将其与服务

13、器的器的IP地址和端口号地址和端口号绑定。定。这个个过程可以通程可以通过Socket类。 2) 在指定的端口在指定的端口进行行监听,以便接受客听,以便接受客户端端连接接请求。求。 3) 一旦接受了客一旦接受了客户端的端的连接接请求,就根据客求,就根据客户端端发送的送的连接接信息信息创建与建与该客客户端端对应的的Socket对象。象。 4) 根据根据创建的建的Socket对象,分象,分别与每个与每个连接的客接的客户进行数据行数据传输。 5) 根据根据传送信息情况确定是否关送信息情况确定是否关闭与与对方的方的连接。接。16164.1.1 面向连接的套接字面向连接的套接字 使用同步使用同步TCP编写

14、客写客户端程序的一般步端程序的一般步骤为: 1) 创建一个包含建一个包含传输过程中采用的网程中采用的网络类型、数据型、数据传输类型和型和协议类型的型的Socket对象。象。 2) 与与远程服程服务器建立器建立连接。接。 3) 与服与服务器器进行数据行数据传输。 4) 完成工作后,向服完成工作后,向服务器器发送关送关闭信息,并关信息,并关闭与服与服务器的器的连接。接。17174.1.1 面向连接的套接字(续)面向连接的套接字(续)1.建立建立连接(服接(服务器)器)IPEndPoint iep = new IPEndPoint(local.AddressList0, 1180);Socket l

15、ocalSocket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);localSocket.Bind(iep);locatSocket.Listen(10);Socket clientSocket = localSocket.Accept();18184.1.1 面向连接的套接字(续)面向连接的套接字(续)1.建立建立连接(客接(客户端)端)IPAddress remoteHost = IPAddress.Parse(192.168.0.1);PEndPoint iep = new

16、IPEndPoint(remoteHost, 1180);Socket localSocket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);localSocket.Connect(iep);19194.1.1 面向连接的套接字(续)面向连接的套接字(续)2. 发送、接收信息(服送、接收信息(服务器)器) Socket clientSocket = localSocket.Accept();/建立建立连接后,利用接后,利用Send方法向客方法向客户端端发送信息送信息clientSoc

17、ket.Send(Encoding.ASCII.GetBytes(server send Hello);/接收客接收客户端信息端信息byte myresult = new Byte1024;int receiveNum = clientSocket.Receive(myresult);Console.WriteLine(接收客接收客户端消息:端消息:0, Encoding.ASCII.GetString(myresult);20204.1.1 面向连接的套接字(续)面向连接的套接字(续)2. 发送、接收信息(客送、接收信息(客户端)端)/建立建立连接成功后,向服接成功后,向服务器器发送信息送信

18、息string sendMessage = client send Message Hello+DateTime.Now;localSocket.Send(Encoding.ASCII.GetBytes(sendMessage);Console.WriteLine(向服向服务器器发送消息送消息:0, sendMessage);/接收服接收服务器信息器信息byte result = new Byte1024;localSocket.Receive(result);Console.WriteLine(接收服接收服务器消息:器消息:0, Encoding.ASCII.GetString(result

19、);21214.1.1 面向连接的套接字(续)面向连接的套接字(续)3.关关闭连接接通信完成后,必通信完成后,必须先用先用Shutdown方法停止会方法停止会话,然后关,然后关闭Socket实例例 。 例如:例如: sock.Shutdown(SocketShutdown.Both);sock.Close();22224.1.2 无连接的套接字UDP使用无使用无连接的套接字,无接的套接字,无连接的套接字不需要在网接的套接字不需要在网络设备之之间发送送连接信息。接信息。注意注意:必必须使用使用Bind方法将套接字方法将套接字绑定到一个本地地址和端口之定到一个本地地址和端口之后才能使用后才能使用R

20、eceiveFrom方法接收数据,如果只方法接收数据,如果只发送而不送而不接收,接收,则不需要使用不需要使用Bind方法。方法。23234.1.2 无连接的套接字Socket()Bind()ReceiveFrom()SendTo()Close()Socket()Bind()SendTo()ReceiveFrom()Close()设备1设备2无连接套接字编程2424第第4章章 套接字与数据流套接字与数据流4.1 套接字套接字4.1.1 面向面向连接的套接字接的套接字 4.1.2 无无连接的套接字接的套接字4.2 数据流数据流4.2.1 文件流文件流4.2.2 内存流内存流4.2.3 网网络流流4

21、.2.4 StreamWriter与与StreamReader类4.2.5 BinaryReader与与BinaryWrite类25254.2 数据流数据流流(流(stream)是)是对串行串行传输的数据(以字的数据(以字节为单位位)的一种抽象表示,底)的一种抽象表示,底层的的设备可以是文件、外部可以是文件、外部设备、主存、网、主存、网络套接字等。套接字等。26264.2 数据流数据流流提供三种基本操作:流提供三种基本操作: 写入:写入:将数据从内存将数据从内存缓冲区冲区传输到外部源。到外部源。 读取:取:将数据从外部源将数据从外部源传输到内存到内存缓冲区。冲区。 查找:找:重新重新设置流的当

22、前位置,以便随机置流的当前位置,以便随机读写。需要注意写。需要注意的是,并不是所有的流的是,并不是所有的流类型都能型都能够支持支持查找,例如,网找,例如,网络流没有当前位置的流没有当前位置的统一概念,因此一般不支持一概念,因此一般不支持查找。找。 说明:明:Stream类提供有多种操作流的方法,其中提供有多种操作流的方法,其中Read和和Write方法是方法是Stream类及其派生及其派生类都提供的都提供的实现,可支持在,可支持在字字节级别上上对数据数据进行行读写。写。实际的程序开的程序开发中,中,仅支持支持字字节级别的数据的数据处理会理会给开开发人人员带来不便。来不便。27274.2 数据流

23、数据流提供字符串或二提供字符串或二进制方式制方式读取或写入流。取或写入流。优点:点:u方法更灵活方法更灵活u部分方法可解决部分方法可解决TCP消息通信无消息通信无边界界问题28284.2.1 FileStream类类FileStream类继承于承于Stream类,一个,一个FileStream类的的实例例实际上代表一个磁上代表一个磁盘文件,使用文件,使用FileStream类可以可以对文件文件系系统上的文件上的文件进行行读取、写入、打开和关取、写入、打开和关闭操作。操作。 1、创建建FileStream实例例 (1)常用的构造函数具有三个参数,例如:常用的构造函数具有三个参数,例如: File

24、Stream(string path,FileMode mode, FileAccess access) 29294.2.1 FileStream类类FileMode值用于指定当文件不存在用于指定当文件不存在时是否是否创建建该文件,并文件,并确定是保留确定是保留还是改写是改写现有文件的内容有文件的内容 30304.2.1 FileStream类类FileAccess值是枚是枚举的一个成的一个成员,它控制,它控制对文件的文件的访问权限。表限。表4-10列出了列出了FileAccess所有的枚所有的枚举形式形式 (2)File和和FileInfo类也提供了也提供了创建建FileStream对象的方

25、法。其中象的方法。其中,OpenRead方法返回只方法返回只读文件流,文件流,OpenWrite方法返回只方法返回只写文件流。写文件流。 例如:例如:FileStream fs= File.OpenRead(C:File1.txt);31314.2.1 FileStream类类2. 读文件文件 在在获取取FileStream实例之后,可利用例之后,可利用FileStream对象的象的Read方法方法读取文件中的数据。取文件中的数据。该方法用于从流中方法用于从流中读取字取字节块并将并将该数据写入数据写入给定字定字节数数组中。其中。其语法形式法形式为: public override int Re

26、ad(byte array,int offset, int count) array : 存存储从文件流中从文件流中读取的数据。取的数据。 offset : array字字节数数组中开始写入数据的下中开始写入数据的下标,一般,一般为0。 size : 要从文件流中要从文件流中读出字出字节的大小的大小 返回返回值: 从从FileStream中中读取的字取的字节数。数。【例例3-2】利用利用FileStream的的Read方法从一个文本文件中方法从一个文本文件中读取内取内容并容并显示在屏幕上。示在屏幕上。32324.2.1 FileStream类类3. 写文件写文件Stream类及其所有子及其所有

27、子类都提供了都提供了Write方法,方法,FileStream类也不例外。也不例外。该方法可将字方法可将字节数数组写入流。写入流。语法形式法形式为public override void Write (byte buffer, /包含要写入流的数据包含要写入流的数据int offset, / buffer中开始写入数据的位置中开始写入数据的位置int size /要写入流的字要写入流的字节数数)【例例3-3】利用利用FileStream的的Write方法向文本文件中追加方法向文本文件中追加数据。数据。33334.2.2 MemoryStream类类 MemoryStream类表示的是保存在内存

28、中的数据流。由内存表示的是保存在内存中的数据流。由内存流封装的数据可以在内存中直接流封装的数据可以在内存中直接访问。MemoryStream类的构造函数具有多种重的构造函数具有多种重载形式,常用的构形式,常用的构造函数有:造函数有:(1)MemoryStream () 该构造函数初始分配的容量大小构造函数初始分配的容量大小为0,随着数据的不断写入容,随着数据的不断写入容量可以量可以不断不断扩展展。(2)MemoryStream (Byte) 该构造函数构造函数获取的取的MemoryStream实例根据例根据Byte字字节数数组进行初始化,并且行初始化,并且实例容量例容量大小固定大小固定即即为字

29、字节数数组的的长度。度。由于由于实例的容量不能例的容量不能扩展,展,该构造函数一般用于数据不构造函数一般用于数据不发生生变化的化的场合。合。34344.2.2 MemoryStream类类 String testdata = 测试数据数据; char chars = testdata.ToCharArray(); Byte bytes = new Byteencoder.GetByteCount(chars, 0, chars.Length, true); MemoryStream mem = new MemoryStream(bytes);(3)MemoryStream (int capac

30、ity) 通通过该构造函数构造函数创建初始容量大小建初始容量大小为capacity的的实例,并例,并且且实例容量大小可例容量大小可扩展。展。【例例3-4】利用利用MemoryStream暂存数据。存数据。35354.2.3 网络流网络流在在System.Net.Sockets名称空名称空间中有一个中有一个NetworkStream类,用于通,用于通过网网络套接字套接字发送和接收数据。送和接收数据。NetworkStream类支持支持对网网络数据的同步或异步数据的同步或异步访问,它,它可被可被视为在数据来源端和接收端之在数据来源端和接收端之间架架设了一个数据通道了一个数据通道. 只用于只用于面向

31、面向连接的接的数据数据传输3636写入写入操作是指从来源端内存操作是指从来源端内存缓冲区到网冲区到网络上的数据上的数据传输;读取取操作是从网操作是从网络上到接收端内存上到接收端内存缓冲区(如字冲区(如字节数数组)的数据)的数据传输。4.2.3 网络流(续)网络流(续)37374.2.3 网络流(续)网络流(续)NetworkStream的用法的用法1、构造构造NetworkStream:(1)利用)利用TcpClient获取网取网络流流对象,例如:象,例如:TcpClient tcpClient=new TcpClient();tcpClient.Connect(, 51888);Networ

32、kStream networkStream = client.GetStream();(2)利用)利用Socket获取网取网络流流对象,例如:象,例如:NetworkStream myNetworkStream = new NetworkStream(mySocket);38384.2.3 网络流(续)网络流(续)2、发送数据送数据 public override void Write (byte buffer,int offset,int size )39394.2.3 网络流(续)网络流(续)3、接收数据、接收数据public override int Read (InAttribute

33、OutAttribute byte buffer,int offset,int size) 各参数的含各参数的含义: buffer:内存中用于存内存中用于存储从从NetworkStream读取的数据的位置。取的数据的位置。offset:buffer 中开始将数据存中开始将数据存储到的位置。到的位置。Size:要从要从NetworkStream中中读取的字取的字节数。数。返回返回值:实际从从NetworkStream中中读取的字取的字节数。数。40404.2.3 网络流(续)网络流(续)Write方法:方法:1.NetworkStream对象的象的Write方法的返回方法的返回值为void,该对

34、象之所以不象之所以不返回返回实际发送的字送的字节数,是因数,是因为能保能保证字字节数数组中的数据全部中的数据全部发送到送到TCP发送送缓冲区中。冲区中。 2.在使用在使用NetworkStream对象的象的Write方法前最好先方法前最好先检测NetworkStream对象的象的Writeable属性是否属性是否为True。 3.如果如果发送的全部是送的全部是单行文本信息,行文本信息,创建建NetworkStream对象后,使象后,使用用StreamReader和和StreamWriter的的ReadLine和和WriteLine方法更方法更简单。Read方法:方法:1.调用用NetworkS

35、tream类的的Read方法前方法前应确保确保NetworkStream对象的象的CanRead属性属性值有效有效2.由于有可能由于有可能TCP接收接收缓冲区冲区还没有接收到没有接收到对方方发送送过来的指定来的指定长度的度的数据,所以数据,所以Read方法有一个整型的返回方法有一个整型的返回值。3.如果如果远程主机关程主机关闭了套接字了套接字连接,并且此接,并且此时有效数据已有效数据已经被完全接收被完全接收,那么,那么Read方法的返回方法的返回值将会是将会是0字字节。41414.2.3 网络流(续)网络流(续)使用使用NetworkStream对象象时,需要注意:需要注意:(1)通)通过Da

36、taAvailable属性,可以迅速属性,可以迅速查看在看在缓冲区中是冲区中是否有数据等待否有数据等待读出。出。(2)网)网络流没有当前位置的概念,因此它不支持流没有当前位置的概念,因此它不支持对数据流的数据流的查找和随机找和随机访问,NetworkStream对象的象的CanSeek属性始属性始终返回返回false,读取取Position属性和属性和调用用Seek方法方法时,都会,都会引引发NotSupportedException异常。异常。(3)网)网络数据数据传输完成后,不要忘完成后,不要忘记用用Close方法关方法关闭NetworkStream对象。象。42424.2.4 Strea

37、mWriter与与StreamReader类类可以看到所有的可以看到所有的NetworkStream、MemoryStream、FileStream类都提供了以字都提供了以字节为基本基本单位的位的读写方法,但是写方法,但是这种方法需要首先将待写入的数据种方法需要首先将待写入的数据转化化为字字节数数组后才能后才能够进行行读写,当操作的是使用字符写,当操作的是使用字符编码的文本数据的文本数据时,给开开发人人员带来了不便。来了不便。StreamReader类主要完成以一种特定的主要完成以一种特定的编码从流中从流中读取字取字符的功能,一般用于符的功能,一般用于对文本数据的文本数据的读取操作;取操作;S

38、treamWriter类则主要以特定的主要以特定的编码向流中写入字符,一向流中写入字符,一般用于般用于对文本数据的写操作。文本数据的写操作。43434.2.4 StreamWriter与与StreamReader类类1、创建建StreamWriter实例例(1)StreamWriter (String path) 根据文件路径根据文件路径创建以建以UTF-8编码StreamWriter对象。例如:象。例如: StreamWriter sw= new StreamWriter (C:file1.txt);(2)File及及FileInfo类提供的提供的CreateText方法。例如:方法。例如:

39、 StreamWriter sw = File.CreateText (C:file1.txt);44444.2.4 StreamWriter与与StreamReader类类1、创建建StreamWriter实例(例(续)(3)StreamWriter (Stream stream)直接使用流直接使用流对象象创建建StreamWriter对象。例如:象。例如: FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite); StreamWriter sw = new StreamWriter (fs)

40、;如果已如果已经有了网有了网络流流对象,同象,同样可以直接可以直接对网网络流流对象象进行封装。行封装。 NetworkStream networkStream = client.GetStream(); StreamWriter sw = new StreamWriter (networkStream);45454.2.4 StreamWriter与与StreamReader类类2、写入文本、写入文本 利用利用StreamWriter类将以一种特定的将以一种特定的编码向流中写入字符。向流中写入字符。常常见方法如下所示:方法如下所示: Write():向数据流写入数据。向数据流写入数据。Writ

41、e()方法只是把方法只是把传送送给它它的字符串写入流,但不追加的字符串写入流,但不追加换行符,因此可以使用行符,因此可以使用Write()语句写入完整的句子或段落。句写入完整的句子或段落。 WriteLine():向数据流写入指定数据和一个向数据流写入指定数据和一个换行符。行符。 Close():关关闭流。流。【例例3-5】利用利用StreamWriter类向向C盘中的文本文件中的文本文件file1.txt中写中写入一行数据。入一行数据。46464.2.4 StreamWriter与与StreamReader类类3.创建建StreamReader实例例(1)SteamReader (Strea

42、m stream)利用流利用流对象象创建建SteamReader对象。例如:象。例如:NetworkStream networkStream = client.GetStream();SteamReader sr = new SteamReader (networkStream)(2)SteamReader (String path)如果需要如果需要处理的是文件流,理的是文件流,则可以根据文件路径可以根据文件路径创建一个建一个以以UTF8编码的的SteamReader对象。例如:象。例如:SteamReader sr = new SteamReader (C:file1.txt);47474.

43、2.4 StreamWriter与与StreamReader类类读取文本取文本利用利用StremReader将以一种特定的将以一种特定的编码从流中从流中读取字符。取字符。常用方法有:常用方法有:uReadLine():读取数据直到遇到取数据直到遇到换行符(行符(Unix)或者回)或者回车换行(行(Windows)为止。止。uReadToEnd():读取到文件尾的全部数据。取到文件尾的全部数据。uPeek():返回数据中下一个可用字符的:返回数据中下一个可用字符的编码值,如到达文,如到达文件末尾件末尾则Peek()方法的方法的值为-1。uClose():关:关闭流,使用流,使用StreamRea

44、der之后,需要之后,需要调用用Close方法关方法关闭流。流。【例例3-6】利用利用StreamReader类将文本文件中的内容在控制台中将文本文件中的内容在控制台中显示。示。48484.2.5 BinaryReader和和BinaryWriter类类提供了提供了BinaryReader和和BinaryWriter类,用于以二,用于以二进制模制模式式读写流。写流。它它们提供的一些提供的一些读写方法是写方法是对称的,比如称的,比如针对不同的数据不同的数据结构,构,BinaryReader提供了提供了ReadByte、ReadBoolean、ReadInt、ReadInt16、ReadDouble、ReadString等方法等方法,与之,与之对应BinaryWriter则提供了多个重提供了多个重载Write方法。例方法。例如当如当Write方法方法传递的参数的参数为Int32类型型时,BinaryWriter类的的Write方法将方法将Int32类型数据型数据转化化为长度度为4的字的字节数数组,并将字并将字节流流传递给一个一个Stream对象。象。 u方法方法详细说明参看明参看课本表本表3-13【例例3-7】向二向二进制文件中写入数据。制文件中写入数据。4949本章习题及实验本章习题及实验习题: 习题1、习题2、习题3、习题4、习题5实验:本章无:本章无实验。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号