Reader和Writer

正如本章中对流的描述,Stream类用于字节的输入和输出。可以通过使用Reader和Writer类向使用其他类型的流以及字符串进行输入和输出。表7-3列出了一些常用的Readar和Writer类。

表7-3  常用的Reader和Writer类

   

BinaryReaderBinaryWriter

这些类型特定的编码将基本类型作为

二进制对流进行读取和写入

TextReaderTextWriter

这些类用来对字符进行输入和输出

StreamReaderStreamWriter

这些类继承自TextReaderTextWdter类,

从流中读取和向流中写入其字符

StringReaderStringWriter

这些类也是继承自TextReaderTextWriter类,

但它们从字符串中读取字符和将字

符写入到StringBuilder类中

由于Reader、Writer与流紧密相关,因此用户可容易地读写期望的类型。

下面的示例演示了如何将类型为Integer的数据写入一个新的名为Test.data的空文件流中,以及如何从中读取数据。在当前目录下创建完数据文件后,使用BinaryWriter类把整数从0~10写入Test.data,然后BianryReader类读取文件并在控制台上显示文件内容。

【实例7-1】  将类型为Integer的数据写入名为Test.data的空文件流中,并从中读取数据。

  1. using System;  
  2. using System.IO;  
  3. class MyStream  
  4. {  
  5.     private const string FILE_NAME = "Test.data";  
  6.     public static void Main(string[] args)  
  7.     {  
  8.         //创建新的空数据文件  
  9.         if (File.Exists(FILE_NAME))  
  10.         {  
  11.             Console.WriteLine("{0} already exists!", FILE_NAME);  
  12.             return;  
  13.         }  
  14.         FileStream fs = new FileStream(FILE_NAME, FileMode.CreateNew);  
  15.         //为数据创建writer  
  16.         BinaryWriter w = new BinaryWriter(fs);  
  17.         //向Test.data中写入数据  
  18.         for (int i = 0; i < 11; i++)  
  19.         {  
  20.             w.Write((int)i);  
  21.         }  
  22.         w.Close();  
  23.         fs.Close();  
  24.         //为数据创建reader  
  25.         fs = new FileStream(FILE_NAME, FileMode.Open,FileAccess.Read);  
  26.         BinaryReader r = new BinaryReader(fs);  
  27.         //从Test.data中读取数据  
  28.         for (int i = 0; i < 11; i++)  
  29.         {  
  30.             Console.WriteLine(r.ReadInt32());  
  31.             w.Close();  
  32.         }  
  33.     }  

在下面的示例中定义了一个字符串,并将其转换为一个字符数组,然后通过使用适当的StringReaderRead方法来按照预期读取这个数组。

【实例7-2】  StringReaderRead方法。

  1. using System;  
  2. using System.IO;  
  3. public class charsFromstr  
  4. {  
  5.     public static void Main(string[] args)  
  6.     {  
  7.     //创建一个字符串,用于从其中读取字符  
  8.     string str="some number Of characters";  
  9.     //调整数组大小来保存字符串的所有字符,以使这些字符都是可访问的  
  10.     char[] b=new char[24];  
  11.     //创建StringReader并将其附加到该字符串  
  12.     StringReader sr = new StringReader(str);  
  13.     //从保存字符串的数组的第一个数组成员开始读取字符  
  14.     sr.Read(b,0,13);  
  15.      //显示输出  
  16.     Console.WriteLine(b);  
  17.     //关闭stringReader  
  18.     sr.Close();  
  19.     }  

输出如下:

  1. some number 0 

公共语言运行库在内部使用Unicode表示所有字符,然而在网络上传送字符或在文件中保存字符时Unicode的效率比较低。为提高效率,.NET框架类库提供了几种派生自System.Text.Encoding抽象基类的类,这些类可以把Unicode字符编码或解码为ASCII码(American Standard Code for Information Interchange,美国信息交换标准码)、UTF-7、UTF-8 (UCS Transformation Format,通用字符集转换格式)、Unicode和其他任意的代码页。当构建BinaryReader、BinaryWriter、StreamReadar或StreamWriter时,可以选择这些编码方案中的任意一种。默认的编码方案是UTF-8。

当需要编码或解码一系列的字符时,应该获取一个继承自System Text Encoding类的实例。Encoding提供了几个静态属性,每个静态属性返回一个继承自Encoding类的实例。每个编码类都是一个包含了WideCharToMultiByte和MultiByteToWideCharWin32函数的包。

【实例7-3】  使用UTF-8编码和解码字符。

  1. using System;  
  2. using System.Text;  
  3. class App  
  4. {  
  5.     static void Main()  
  6.     {  
  7.     //这是将要编码的字符串  
  8.     String s="Hi there";  
  9.     //获取一个知道怎样使用UTF-8进行编码/解码的Encoding的派生对象  
  10.     Encoding encodingUTF8=System.Text.Encoding.UTF8;  
  11.     //将字符串编码为字节数组  
  12.     Byte [] encodedBytes=encodingUTF8.GetBytes(s);  
  13.     //显示编码后的字节值  
  14.     Console.WriteLine("Encoded bytes:"+BitConverter.ToString(encodedBytes));  
  15.     //将字节数组解码为字符串  
  16.     string decodedstring = encodingUTF8.GetString(encodedBytes);  
  17.     //显示解码后的字符串  
  18.     Console.WriteLine("Decoded sting:" + decodedstring);  
  19.     }  

输出如下:

  1. Encoded bytes:48-69-20-74-68-65-72-65-ZE  
  2. Decoded string:Hi there 
posted @ 2010-04-03 22:14  逆时针  阅读(2078)  评论(0编辑  收藏  举报