Reader和Writer
正如本章中对流的描述,Stream类用于字节的输入和输出。可以通过使用Reader和Writer类向使用其他类型的流以及字符串进行输入和输出。表7-3列出了一些常用的Readar和Writer类。
表7-3 常用的Reader和Writer类
类 |
描 述 |
BinaryReader和BinaryWriter |
这些类型特定的编码将基本类型作为 二进制对流进行读取和写入 |
TextReader和TextWriter |
这些类用来对字符进行输入和输出 |
StreamReader和StreamWriter |
这些类继承自TextReader和TextWdter类, 从流中读取和向流中写入其字符 |
StringReader和StringWriter |
这些类也是继承自TextReader和TextWriter类, 但它们从字符串中读取字符和将字 符写入到StringBuilder类中 |
由于Reader、Writer与流紧密相关,因此用户可容易地读写期望的类型。
下面的示例演示了如何将类型为Integer的数据写入一个新的名为Test.data的空文件流中,以及如何从中读取数据。在当前目录下创建完数据文件后,使用BinaryWriter类把整数从0~10写入Test.data,然后BianryReader类读取文件并在控制台上显示文件内容。
【实例7-1】 将类型为Integer的数据写入名为Test.data的空文件流中,并从中读取数据。
- using System;
- using System.IO;
- class MyStream
- {
- private const string FILE_NAME = "Test.data";
- public static void Main(string[] args)
- {
- //创建新的空数据文件
- if (File.Exists(FILE_NAME))
- {
- Console.WriteLine("{0} already exists!", FILE_NAME);
- return;
- }
- FileStream fs = new FileStream(FILE_NAME, FileMode.CreateNew);
- //为数据创建writer
- BinaryWriter w = new BinaryWriter(fs);
- //向Test.data中写入数据
- for (int i = 0; i < 11; i++)
- {
- w.Write((int)i);
- }
- w.Close();
- fs.Close();
- //为数据创建reader
- fs = new FileStream(FILE_NAME, FileMode.Open,FileAccess.Read);
- BinaryReader r = new BinaryReader(fs);
- //从Test.data中读取数据
- for (int i = 0; i < 11; i++)
- {
- Console.WriteLine(r.ReadInt32());
- w.Close();
- }
- }
- }
在下面的示例中定义了一个字符串,并将其转换为一个字符数组,然后通过使用适当的StringReaderRead方法来按照预期读取这个数组。
【实例7-2】 StringReaderRead方法。
- using System;
- using System.IO;
- public class charsFromstr
- {
- public static void Main(string[] args)
- {
- //创建一个字符串,用于从其中读取字符
- string str="some number Of characters";
- //调整数组大小来保存字符串的所有字符,以使这些字符都是可访问的
- char[] b=new char[24];
- //创建StringReader并将其附加到该字符串
- StringReader sr = new StringReader(str);
- //从保存字符串的数组的第一个数组成员开始读取字符
- sr.Read(b,0,13);
- //显示输出
- Console.WriteLine(b);
- //关闭stringReader
- sr.Close();
- }
- }
输出如下:
- 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编码和解码字符。
- using System;
- using System.Text;
- class App
- {
- static void Main()
- {
- //这是将要编码的字符串
- String s="Hi there";
- //获取一个知道怎样使用UTF-8进行编码/解码的Encoding的派生对象
- Encoding encodingUTF8=System.Text.Encoding.UTF8;
- //将字符串编码为字节数组
- Byte [] encodedBytes=encodingUTF8.GetBytes(s);
- //显示编码后的字节值
- Console.WriteLine("Encoded bytes:"+BitConverter.ToString(encodedBytes));
- //将字节数组解码为字符串
- string decodedstring = encodingUTF8.GetString(encodedBytes);
- //显示解码后的字符串
- Console.WriteLine("Decoded sting:" + decodedstring);
- }
- }
输出如下:
- Encoded bytes:48-69-20-74-68-65-72-65-ZE
- Decoded string:Hi there